R,data.table:如何根据存储在字符向量中的其他列的名称来分配某些列的值?

时间:2016-04-06 15:58:01

标签: r data.table

我有以下数据表:

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

我将一些列的名称存储在一个向量中,将其他列的名称存储在另一个向量中:

names1=names(dt)[1:2]
names2=names(dt)[3:4]

当某些条件适用时,我需要将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

我尝试了以下语法但没有成功:

dt[c(2,3),names1:=dt[c(2,3),names2,with=F]]

但它仍然试图分配names2

中包含的字符串向量的值

2 个答案:

答案 0 :(得分:7)

我愿意

dt[2:3, (names1) := .SD, .SDcols = names2]

或者另一种方法,感谢@DavidArenburg:

dt[c(2,3), (names1) := mget(names2)]

工作原理

  • 正如@DavidArenburg解释的那样,(names1) :=中的括号确保我们查看names1向量的内容,而不是创建名为"names1"的列。
  • 我建议浏览the first vignette for the package了解.SDcols的详细信息。
  • mget根据名称查找对象并将其放入列表中。

答案 1 :(得分:0)

我发现我可以使用= F进行此操作,在某种程度上效率低下吗?

我发现它的方式是这样的:

dt[c(2,3),names1:=dt[c(2,3),names2,with=F],with=F]

对效率的任何评论都会得到很好的接受。

谢谢。