R 修改表中多列的值

R 修改表中多列的值,r,data.table,R,Data.table,下面是我的示例数据: library(data.table) mydata <- fread( "sample,neg1,neg2,neg3,gen1,gen2 sample1, 0, 1, 2, 30, 60 sample2, 1, 0, 1, 15, 30 sample3, 2, 1, 0, 10, 20 ") 它完成了这项工作,但在我真正大的表上运行非常慢——我想,这是因为使用了.SD。有没有更好的方法来完成这项任务?以某种方式使用set

下面是我的示例数据:

library(data.table)
mydata <- fread(
"sample,neg1,neg2,neg3,gen1,gen2
sample1,   0,   1,   2,  30, 60
sample2,   1,   0,   1,  15, 30
sample3,   2,   1,   0,  10, 20
")
它完成了这项工作,但在我真正大的表上运行非常慢——我想,这是因为使用了
.SD
。有没有更好的方法来完成这项任务?以某种方式使用
set


(这个问题与我的问题非常相似:这里的源数据是另一种形式,因此我无法找到将相同的解决方案应用于
set
,希望它不会被视为重复)。

您可以获得“neg”列(“val”)的
rowMeans
,然后更新所有列(从“val”中减去)使用
set
设置除第一个数据集以外的数据集

 indx <- grep('^neg', names(mydata))
 val <- as.integer(rowMeans(mydata[, ..indx]))
 for(j in 2:ncol(mydata)){
  set(mydata, i=NULL, j=j, value=mydata[[j]]-val)
 }

 mydata
 #    sample neg1 neg2 neg3 gen1 gen2
 #1: sample1   -1    0    1   29   59
 #2: sample2    1    0    1   15   30
 #3: sample3    1    0   -1    9   19

indx Oops,很抱歉。我想出了一个两步解决方案。您可以检查对您的解决方案进行wrt是否更快
mydata1另一个选项是分别获取所选列上的
rowMeans
,然后使用
set
更新所有列。我更新了解决方案谢谢你的指点,我修改了它并移到了结尾(这里的第四条评论看起来很奇怪;此外,我认为我链接到的前一个问题可能对某人也有用)。把整个问题都融为一体怎么样(我的意思是使用
reformae2
中的
melt
gather
tidyr
将数据帧转换为“长”格式),然后问题就变得微不足道了?
 indx <- grep('^neg', names(mydata))
 val <- as.integer(rowMeans(mydata[, ..indx]))
 for(j in 2:ncol(mydata)){
  set(mydata, i=NULL, j=j, value=mydata[[j]]-val)
 }

 mydata
 #    sample neg1 neg2 neg3 gen1 gen2
 #1: sample1   -1    0    1   29   59
 #2: sample2    1    0    1   15   30
 #3: sample3    1    0   -1    9   19