在 R 中展平或取消列出数据框

Posted

技术标签:

【中文标题】在 R 中展平或取消列出数据框【英文标题】:Flatten or unlist a data frame in R 【发布时间】:2017-08-09 00:20:10 【问题描述】:

我正在使用Googleway 包来获取一堆经纬度坐标的高程信息,总共有 954 个。

我已将调用拆分为 3 个单独的文件,但它们采用列表格式,当我将它们转换为数据框时,它们采用嵌套数据框格式。我一直在尝试将文件展平并取消列出它们,但没有成功。

DF <- read.csv("Site Coor R.csv", header = T, colClasses = c("numeric","numeric"))

result1 <- google_elevation(df_locations = DF[1:350,], key = "KEY")
result2 <- google_elevation(df_locations = DF[351:700,], key = "KEY")
result3 <- google_elevation(df_locations = DF[701:954,], key = "KEY")

> str(result1)
List of 2
 $ results:'data.frame':    350 obs. of  3 variables:
  ..$ elevation : num [1:350] 14.15 2.14 2.66 6.78 23.27 ...
  ..$ location  :'data.frame':  350 obs. of  2 variables:
  .. ..$ lat: num [1:350] 52.7 52.7 52.7 52.9 52.7 ...
  .. ..$ lng: num [1:350] -8.61 -8.83 -8.92 -8.98 -8.91 ...
  ..$ resolution: num [1:350] 611 611 611 611 611 ...
 $ status : chr "OK"


do.call("c", result1[["location"]])

result1 <- unlist(result1, recursive = TRUE, use.names = TRUE)

write.table(data.frame(subset(result1DF,select=-c(results.location)),unclass(result1DF$results.location)))

由于result1result2result3 具有相同的结构,是否有一种简单的方法可以将它们合并,展平连体表,然后导出为 CSV?

【问题讨论】:

试试do.call(data.frame, result1$results) 对于每个结果调用function(r) cbind(r$results$elevation, r$results$location, r$results$resolution) 以从结果中获取平面数据框。之后,您必须 rbind() result1result2result3 的数据帧 【参考方案1】:

我们可以在一次调用中获取list 中的所有对象并创建data.frame

lst <- lapply(mget(paste0("result", 1:3)), function(x) do.call(data.frame, x$results))
str(lst[[1]])
#'data.frame':   12 obs. of  3 variables:
#$ elevation   : num  -0.546 0.537 0.42 -0.584 0.847 ...
#$ location.lat: int  61 85 53 80 82 52 66 62 68 57 ...
#$ location.lng: int  11 7 10 19 1 -2 -6 -8 -14 -13 ...

如果我们需要一个表,那么rbind他们一起

library(data.table)
dt <- rbindlist(lst)
fwrite(dt, file = "yourfile.csv")

数据

f1 <- function(seed)
     set.seed(seed)
     results <- data.frame(elevation = rnorm(12))
     results$location <- data.frame(lat = sample(50:100, 12, replace=TRUE), 
           lng = sample(-15:20, 12, replace=TRUE))
      results
  

result1 <- list(results = f1(24), status = "OK")
result2 <- list(results = f1(42), status = "OK")
result3 <- list(results = f1(343), status = "OK")

【讨论】:

感谢您抽出宝贵的时间来整理,希望有一天我能像您一样精通R; ) @PigWolf 如果你经常练习,不会花那么多时间

以上是关于在 R 中展平或取消列出数据框的主要内容,如果未能解决你的问题,请参考以下文章

取消列出 R 中列表的最后一级

如何在R中取消列出一个非常混乱的列表[重复]

如何在不增加行的情况下取消列出 R 和 inner_join 中的对象?

展平和取消展平 numpy 数组的嵌套列表

展平/取消展平嵌套 JSON 对象的最快方法

如何在 Amazon Redshift 的列中取消嵌套/展开/展平逗号分隔值?