我正在用生物信息学构建一个R包,我有一个数据表,其中的列名之一是可变的,它将基于输入的基因组数据。我有一条带有条件的行,其中需要两个条件:一行中的一列为NA,另一列大于用户将给出的某个数字。
我尝试将is.na()与mergeframe_dt [,2]之类的东西一起使用,在此我指定列号而不是典型的列名。
通常,这样的方法会起作用:
mergeframe_dt[is.na(new)&Reads>5, new := factor(0)]
但是问题是'new'列名是可变的,在每种情况下它都会不同。在我的代码的前面,我基本上将其设置为用户将输入的基因组文件的名称。
理想情况下,我想要一种类似的功能,它可以检查数据表mergeframe_dt的第二列是否为NA,并且“读取”列是否大于5。
mergeframe_dt<-as.data.table(mergeframe)
mergeframe_dt[is.na(mergeframe_dt[,2])&Reads>5, new := factor(0)]
我也尝试过这个,但是也没用:
mergeframe_dt[is.na(mergeframe_dt$(colnames(mergeframe_dt)[2]))&Reads>5, new := factor(0)]
错误: 范例1:
Error in `[.data.table`(mergeframe_dt, is.na(mergeframe_dt[, 2]) & Reads > :
i is invalid type (matrix). Perhaps in future a 2 column matrix could return a list of elements of DT (in the spirit of A[B] in FAQ 2.14). Please report to data.table issue tracker if you'd like this, or add your comments to FR #657.
示例2:
Error: unexpected '(' in "mergeframe_dt[is.na(mergeframe_dt$("
答案 0 :(得分:1)
仅使用基数R,您可以执行以下操作:
library(data.table)
DT <- data.table(var = as.factor(c(1, NA, NA, 2)),
Reads = 4:7)
new <- "var"
expr <- substitute(DT[is.na(var_name) & Reads > 5, var_name := factor(0)],
list(var_name = as.name(new)))
eval(expr)
print(DT)
var Reads
1: 1 4
2: <NA> 5
3: 0 6
4: 2 7
答案 1 :(得分:0)
惯用的方法是使用.I
mergeframe_dt <- data.table(new=c(1,NA), Reads=c(1,6))
v <- "new"
mergeframe_dt[mergeframe_dt[, .I[is.na(get(v)) & Reads > 5]], (v) := 0L]
我希望..v
也能正常工作,而不是get(v)
,也许我对..
的理解是不正确的。