[英]Update a subset of values in data.table column with values from another data.table column
[英]How to subset data.table on the basis of a values in a certain column number
在data.table中,一种基于列号的数值向量对表进行子集化的方法是使用with=FALSE
。
我正在尝试根据列号的数值向量遍历data.table,以寻找符合特定条件的行 ,如下所示:
require(data.table)
ab=data.table(id=c("geneA", "geneB", "geneC", "geneA", "geneA", "geneB", "", "NA"),
co1=c(1,2,3,0,7), co2=c(0,0,4,5,6), nontarget=c(9,0,7,6,5),
co3=c(0,1,2,3,4))
target_col_nums=grep('co', colnames(ab))
##Data.table doesn't treat colnames(ab)[i] as one of the
## column name variables, and with=F only seems to work for j in dt[i,j,by]
for (i in target_col_nums){
print(ab[colnames(ab)[i]>3])
}
##This produces the desired output
ab[co1>3]
ab[co2>3]
ab[co3>3]
在我的情况下,我的实际表很大,因此我不能使用colnames本身。
我希望这是对社区有用的问题。
for (col in grep('co', names(ab), value = T))
print(ab[get(col) > 3])
# id co1 co2 nontarget co3
#1: geneA 7 6 5 4
# id co1 co2 nontarget co3
#1: geneC 3 4 7 2
#2: geneA 0 5 6 3
#3: geneA 7 6 5 4
#4: NA 3 4 7 2
# id co1 co2 nontarget co3
#1: geneA 7 6 5 4
您可以将( eval
)列作为表达式求值
for (i in target_col_nums){
expr <- paste0(colnames(ab)[i], ">3")
print(ab[eval(parse(text = expr)), ])
}
# id co1 co2 nontarget co3
#1: geneA 7 6 5 4
# id co1 co2 nontarget co3
#1: geneC 3 4 7 2
#2: geneA 0 5 6 3
#3: geneA 7 6 5 4
#4: NA 3 4 7 2
# id co1 co2 nontarget co3
#1: geneA 7 6 5 4
或者您可以尝试在问题中将变量作为data.table列名的任何建议
您可以对方法进行很小的调整,但仍然可以使用列号来解决(尽管在这种情况下,由于您以编程方式获得了列数,所以危害不大),但通常是不好的做法:
target_cols = names(ab)[grepl("co", names(ab))]
sapply(target_cols, function(jj) print(ab[get(jj) > 3]))
如果NULL
输入会使人分心,则将其invisible
,否则会打扰您。
我们可以在.SDcols
指定'i'并使用.SD
上的条件来获取逻辑向量,该逻辑向量可用于子集行。
for(i in target_col_nums){
print(ab[ab[, .SD[[1L]] >3, .SDcols = i]])
}
# id co1 co2 nontarget co3
#1: geneA 7 6 5 4
# id co1 co2 nontarget co3
#1: geneC 3 4 7 2
#2: geneA 0 5 6 3
#3: geneA 7 6 5 4
#4: NA 3 4 7 2
# id co1 co2 nontarget co3
#1: geneA 7 6 5 4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.