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