R:将相同长度的列表合并到tupels列表中

时间:2017-01-19 14:39:42

标签: r list jsonlite

我目前正在努力解决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,我的机器需要很长时间。你有什么解决方案可以加快计算速度吗?

2 个答案:

答案 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