我有数据.我希望对某些列执行相同操作的表.这些列的名称在字符向量中给出.在这个特定的例子中,我想将所有这些列乘以-1.

一些玩具数据和指定相关列的向量:

library(data.table)
dt <- data.table(a = 1:3, b = 1:3, d = 1:3)
cols <- c("a", "b")

现在我这样做,在角色向量上循环:

for (col in 1:length(cols)) {
   dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))]
}

有没有一种方法可以不使用for循环直接实现这一点?

推荐答案

这似乎有效:

dt[ , (cols) := lapply(.SD, "*", -1), .SDcols = cols]

结果是

    a  b d
1: -1 -1 1
2: -2 -2 2
3: -3 -3 3

这里有一些技巧:

  • 因为(cols) :=中有括号,所以结果被分配给cols中指定的列,而不是一些名为"cols"的新变量.
  • .SDcols告诉调用我们只查看这些列,并允许我们使用.SD,即与这些列关联的Data的S子集.
  • lapply(.SD, ...).SD上运行,.SD是一个列列表(如所有data.frames和data.tables).lapply返回一个列表,所以最后j看起来像cols := list(...).

EDIT:这里有另一种可能更快的方法,正如@Arun提到的:

for (j in cols) set(dt, j = j, value = -dt[[j]])

R相关问答推荐

如何按行和列组合多个格式?

将R data.frame转换为json数组(源代码)

在Julia中调用R函数

如何在弹性表中为类别值的背景上色

基于R中的GPS点用方向箭头替换点

根据固定值范围在tible中添加新行

行式dppr中的变量列名

R等效于LABpascal(n,1)不同的列符号

par函数中的缩写,比如mgp,mar,mai是如何被破译的?

是否可以创建一个ggplot与整洁判断的交互作用

R函数‘paste`正在颠倒其参数的顺序

如何从像glm这样的模型中提取系数表的相关性?

根据类别合并(汇总)某些行

如何使这些react 表对象相互独立?

如何计算增加10米(0.01公里)的行?

如何在R中使用混合GAM模型只对固定的影响因素进行适当的预测?

如何显示准确的p值而不是<;0.001*?

如何获取R chromote中的当前URL?

使用R、拼图和可能的网格包绘制两个地块的公共垂直线

使用其他DF中的文件名将列表中的每个元素保存到文件中