【问题标题】:Is there way to use is.na in R with column number references?有没有办法在 R 中使用 is.na 和列号引用?
【发布时间】:2019-06-27 18:58:30
【问题描述】:

我正在构建一个生物信息学 R 包,并且我有一个数据表,其中一个列名是可变的,它将基于输入的基因组数据。我有一条带条件的行,我需要两个条件:一行中的一列是 NA,另一列大于用户将给出的某个数字。

我尝试将 is.na() 与 mergeframe_dt[,2] 之类的东西一起使用,其中我指定列 # 而不是典型的列名。

通常,这样的事情会起作用:

mergeframe_dt[is.na(new)&Reads>5, new := factor(0)]

但问题是“新”列名是可变的,在每种情况下都会有所不同。在我之前的代码中,我基本上将其设置为用户输入的基因组文件的名称。

理想情况下,我想要像这样工作的东西,它检查数据表 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$("

【问题讨论】:

    标签: r data.table bioinformatics na


    【解决方案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
    

    【讨论】:

    • 如果 OP 有列号而不是名称,可以使用new &lt;- names(DT)[num]
    【解决方案2】:

    一种惯用的方式是使用.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),也许我对.. 的理解不正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-05
      • 2020-06-25
      • 2019-05-15
      • 2021-12-26
      • 1970-01-01
      • 2019-06-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多