展平或取消列出 R 中的数据框
Flatten or unlist a data frame in R
我正在使用 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)))
由于 result1
、result2
和 result3
具有相同的结构,是否有一种简单的方法来合并它们,将连体的 table 展平,然后导出为 CSV ?
我们可以获取 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 ...
如果我们需要单个 table,那么 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")
我正在使用 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)))
由于 result1
、result2
和 result3
具有相同的结构,是否有一种简单的方法来合并它们,将连体的 table 展平,然后导出为 CSV ?
我们可以获取 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 ...
如果我们需要单个 table,那么 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")