【问题标题】:"unlist" a list stored in a variable"unlist" 存储在变量中的列表
【发布时间】:2015-09-04 22:25:09
【问题描述】:

我有一个带有两个奇数变量的数据框。对于一个变量,每个单元格存储一个列表,其内容只是两个数字的向量。对于另一个变量,每个单元格存储一个包含 8 个数字的三维数组(即使只需要二维)。

我想通过将奇数变量分解为单独的变量来简化数据集。我想出了如何使用 for 循环分解所有数据,但这非常慢。我知道 apply 通常应该更快,但我不知道如何将其翻译为 apply。有可能吗,或者有更好的方法吗?

for (i in 1:nrow(df)){
  if (length(df$coordinates.coordinates[[i]]>0)){
    df[i,"coordinates.lon"]<- df$coordinates.coordinates[[i]][1]
    df[i,"coordinates.lat"]<- df$coordinates.coordinates[[i]][2]
  }
  if (length(df$place.bounding_box.coordinates[[i]]>0)){
    df[i,"place.bounding_box.a.lon"] <-df$place.bounding_box.coordinates[[i]][1,1,1]
    df[i,"place.bounding_box.b.lon"] <-df$place.bounding_box.coordinates[[i]][1,2,1]
    df[i,"place.bounding_box.c.lon"] <-df$place.bounding_box.coordinates[[i]][1,3,1]
    df[i,"place.bounding_box.d.lon"] <-df$place.bounding_box.coordinates[[i]][1,4,1]
    df[i,"place.bounding_box.a.lat"] <-df$place.bounding_box.coordinates[[i]][1,1,2]
    df[i,"place.bounding_box.b.lat"] <-df$place.bounding_box.coordinates[[i]][1,2,2]
    df[i,"place.bounding_box.c.lat"] <-df$place.bounding_box.coordinates[[i]][1,3,2]
        df[i,"place.bounding_box.d.lat"] <-df$place.bounding_box.coordinates[[i]][1,4,2]
      }
}

编辑 这是一个带有一个案例的示例数据框(通过 dput)

structure(list(coordinates.coordinates = list(c(112.088477, -7.227974
)), place.bounding_box.coordinates = list(structure(c(112.044456, 
112.044456, 112.143242, 112.143242, -7.263067, -7.134563, -7.134563, 
-7.263067), .Dim = c(1L, 4L, 2L)))), .Names = c("coordinates.coordinates", 
"place.bounding_box.coordinates"), class = c("tbl_df", "data.frame"
), row.names = c(NA, -1L))

如果有帮助,这是当您尝试使用 jsonlite 的 stream_in 函数(使用 flatten=TRUE)读取 Twitter 流数据时得到的数据格式

【问题讨论】:

  • 您能提供示例数据吗?

标签: r for-loop apply


【解决方案1】:
library(dplyr)

df = data_frame(
  coordinates.coordinates = 
    list(c(0, 1), c(2, 3)),
  place.bounding_box.coordinates =
    list(array(0, dim=c(1, 4, 2)),
         array(1, dim=c(1, 4, 2))))

df %>%
  rowwise %>%
  do(with(., data_frame(
    longitude = coordinates.coordinates[1],
    latitude = coordinates.coordinates[2]) %>% bind_cols(
      place.bounding_box.coordinates %>%
        as.data.frame %>%
        setNames(c(
          "place.bounding_box.a.lon",
          "place.bounding_box.b.lon",
          "place.bounding_box.c.lon",
          "place.bounding_box.d.lon",
          "place.bounding_box.a.lat",
          "place.bounding_box.b.lat",
          "place.bounding_box.c.lat",
          "place.bounding_box.d.lat")))))

【讨论】:

    猜你喜欢
    • 2021-01-15
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多