修改 table 中多列的值
modify values of multiple columns in a 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
")
并且在每一行中我想减去背景(mean
列 "neg" 列)。我当前的代码如下:
negatives <- names(mydata)[grep("^neg", names(mydata))] # "neg1" "neg2" "neg3"
mydata[, names(mydata)[-1]:={
bg <- mean(unlist(.SD[, negatives, with=F]));
.SD - as.integer(bg);
}, with=F, by=sample]
# 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
它完成了工作,但在我真正更大的 table 上运行起来相当慢 - 我想,这是因为使用了 .SD
。有没有更好的方法来完成这项任务?以某种方式使用 set
?
(这个问题和我的非常相似:源数据在这里是另一种形式,所以我找不到与set
应用相同解决方案的方法,希望它会不被视为重复)。
您可以获得 "neg" 的 rowMeans
列 ("val"),然后更新数据集的所有列(从 "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
所以,这是我的示例数据:
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
")
并且在每一行中我想减去背景(mean
列 "neg" 列)。我当前的代码如下:
negatives <- names(mydata)[grep("^neg", names(mydata))] # "neg1" "neg2" "neg3"
mydata[, names(mydata)[-1]:={
bg <- mean(unlist(.SD[, negatives, with=F]));
.SD - as.integer(bg);
}, with=F, by=sample]
# 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
它完成了工作,但在我真正更大的 table 上运行起来相当慢 - 我想,这是因为使用了 .SD
。有没有更好的方法来完成这项任务?以某种方式使用 set
?
(这个问题和我的set
应用相同解决方案的方法,希望它会不被视为重复)。
您可以获得 "neg" 的 rowMeans
列 ("val"),然后更新数据集的所有列(从 "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