我目前正在努力解决R中的以下问题: 给定两个列表a =(a1,...,an)和b =(b1,...,bn),我想得到一个列表,如((a1,b1),...,(an, BN))。 背景信息:我需要将普通数据表/帧转换为嵌套的json(例如使用jsonlite)。 作为代码示例,考虑具有id,纬度和经度的数据表,后两者将在名为location的列表中进行汇总:
library(data.table)
n<-5
data<-data.table(id=1:n,lon=1:n,lat=1:n)
在这里,我们可以使用lapply来获得所需的结果:
data$location<-lapply(1:nrow(data),function(x) list(data[x,c("lat","lon"),with=F]) )
或者拆分(对于较小的数据集较快,对较大的数据集较慢):
data$location<-list(split(data[,c("lat","lon"),with=F],1:nrow(data)))
两者都可以在小规模上正常工作,但是对于n&gt;> 10 ^ 5,我的机器需要很长时间。你有什么解决方案可以加快计算速度吗?
答案 0 :(得分:1)
我们可以在list
之后将数据子集放在data[, location := list(list(.SD)), id]
之后按&#39; id&#39; in&#39; data.table&#39;并提取默认的新列&#39; V1&#39;
list
我们可以提取data$location
#[[1]]
# lon lat
#1: 1 1
#[[2]]
# lon lat
#1: 2 2
#[[3]]
# lon lat
#1: 3 3
#[[4]]
# lon lat
#1: 4 4
#[[5]]
# lon lat
#1: 5 5
列
{{1}}
答案 1 :(得分:0)
您可以使用data.table::transpose
作为另一种选择:
data[, location := transpose(.(lon, lat))]
data
# id lon lat location
#1: 1 1 1 1,1
#2: 2 2 2 2,2
#3: 3 3 3 3,3
#4: 4 4 4 4,4
#5: 5 5 5 5,5
data$location # this drops the column names, you can refer to the elements by index
#[[1]]
#[1] 1 1
#[[2]]
#[1] 2 2
#[[3]]
#[1] 3 3
#[[4]]
#[1] 4 4
#[[5]]
#[1] 5 5