r-从data.table中的行获取向量

r-从data.table中的行获取向量,r,data.table,R,Data.table,我有一个从csv文件(本质上是SQL查询的结果)中读取的big data.table。每个记录都有几组20个字段,这些字段是特定事项(例如,特定类型的付款)的年度数字。这是一个简化的版本,只有5行和3个年度捐款字段 > dt <- data.table(id=1:5, dob = sample(1950:2000, 5), cont01=11:15, cont02=21:25, cont03=31:35) > dt id dob cont01 cont02 cont03

我有一个从csv文件(本质上是SQL查询的结果)中读取的big data.table。每个记录都有几组20个字段,这些字段是特定事项(例如,特定类型的付款)的年度数字。这是一个简化的版本,只有5行和3个年度捐款字段

> dt <- data.table(id=1:5, dob = sample(1950:2000, 5), cont01=11:15, cont02=21:25, cont03=31:35)
> dt
   id  dob cont01 cont02 cont03
1:  1 1981     11     21     31
2:  2 1954     12     22     32
3:  3 1985     13     23     33
4:  4 1986     14     24     34
5:  5 1970     15     25     35
理想情况下,我想我希望向量作为一个新列出现在数据表中。更理想的是,我需要向量是固定长度的,每个元素在特定的年龄支付。第一行这3列的向量是

> c(rep(0, 5), 11, 21, 31, rep(0, 38))
其中向量中的第一个年龄是15岁,最后一个是60岁

从这一点来看,似乎可以将data.table列包含在列表中。但是我还没有弄清楚如何从同一行中的其他列创建内容

例如:

> dt[1, list(list(c(.SD))), .SDcols=c("cont2011", "cont2012", "cont2013")]
       V1
1: <list>
> dt[1, list(list(c(.SD))), .SDcols=c("cont2011", "cont2012", "cont2013")][,V1]
[[1]]
[[1]]$`cont2011`
[1] 11

[[1]]$cont2012
[1] 21

[[1]]$cont2013
[1] 31
dt[1,list(list(c(.SD)),.SDcols=c(“cont2011”、“cont2012”、“cont2013”)] V1 1: >dt[1,list(list(c(.SD)),.SDcols=c(“cont2011”、“cont2012”、“cont2013”)][,V1] [[1]] [[1]]$`续2011年` [1] 11 [[1]]$cont2012 [1] 21 [[1]]$cont2013 [1] 31 似乎并没有给出我想要的,因为我不知道如何在
V1
列的内容上做一些很好的矢量化工作。(我需要对得到的向量做很多欧几里德距离类型的事情)


有什么想法吗?对替代方法的建议?data.table中大约有1300万行,我希望能够对5组20(大约)列执行此操作。

我们对数据集的列进行子集,
按数据的
索引拆分
,然后
取消列表

subdt <- as.data.frame(dt[, 3:5, with = FALSE])
lapply(split(subdt, row(subdt)), unlist, use.names = FALSE)

您可以使用下面的代码创建列表的新列

dt[, newcol := .(.(c(cont01, cont02, cont03))), by = id]

#    id  dob cont01 cont02 cont03   newcol
# 1:  1 1993     11     21     31 11,21,31
# 2:  2 1960     12     22     32 12,22,32
# 3:  3 1977     13     23     33 13,23,33
# 4:  4 1955     14     24     34 14,24,34
# 5:  5 1959     15     25     35 15,25,35
给出相同结果的另一个选项是

dt[, newcol := .(.(unlist(.SD))), by = id, .SDcols = names(dt)[3:5]]

函数
只是
列表
的别名,可在
[.data.table

中使用。第二个函数对我来说很有用,因为它意味着我可以构建包含20列的列表(令人难以置信地恼火的是,这些列甚至不是连续的),而无需在中键入每一列。
dt[, newcol := .(.(c(cont01, cont02, cont03))), by = id]

#    id  dob cont01 cont02 cont03   newcol
# 1:  1 1993     11     21     31 11,21,31
# 2:  2 1960     12     22     32 12,22,32
# 3:  3 1977     13     23     33 13,23,33
# 4:  4 1955     14     24     34 14,24,34
# 5:  5 1959     15     25     35 15,25,35
dt[, newcol := .(.(unlist(.SD))), by = id, .SDcols = names(dt)[3:5]]