“取消列出”存储在变量中的列表

时间:2015-09-04 22:25:10

标签: r for-loop apply

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

我想通过将奇数变量分解为单独的变量来简化数据集。我想出了如何使用for循环中断所有数据,但这非常慢。我知道申请应该通常更快,但我无法弄清楚我将如何翻译这个申请。是否有可能,还是有更好的方法来做到这一点?

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函数读取Twitter流数据时使用的数据格式(flatten = TRUE)

1 个答案:

答案 0 :(得分:0)

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")))))