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