我有以下数据表:
dt=data.table(a=seq(1,3),b=letters[seq(1,3)],
c=seq(4,6),d=letters[seq(4,6)])
dt
a b c d
1: 1 a 4 d
2: 2 b 5 e
3: 3 c 6 f
Run Code Online (Sandbox Code Playgroud)
我将一些列的名称存储在一个向量中,将其他列的名称存储在另一个向量中:
names1=names(dt)[1:2]
names2=names(dt)[3:4]
Run Code Online (Sandbox Code Playgroud)
当某些条件适用时,我需要将names2中存储的列的值分配给names1的列.就像是
dt[c(2,3),names1:=names2]
dt
a b c d
1: 1 a 4 d
2: 5 e 5 e
3: 6 f 6 f
Run Code Online (Sandbox Code Playgroud)
我尝试了以下语法但没有成功:
dt[c(2,3),names1:=dt[c(2,3),names2,with=F]]
Run Code Online (Sandbox Code Playgroud)
但它仍然试图分配names2中包含的字符串向量的值
我会做
dt[2:3, (names1) := .SD, .SDcols = names2]
Run Code Online (Sandbox Code Playgroud)
或者另一种方法,感谢@DavidArenburg:
dt[c(2,3), (names1) := mget(names2)]
Run Code Online (Sandbox Code Playgroud)
这个怎么运作
(names1) :=确保我们查看names1向量的内容而不是将列命名"names1"..SDcols.mget 根据名称查找对象并将其放入列表中.