首页 > 解决方案 > 如何从特定列中删除(或用 NA 替换)给定值的数据?

问题描述

我正在使用 dN/dS 比率(生物学,对问题并不重要),并且最终在我的数据中出现了一些伪影(特定列中大于 3 的任何东西都可能不可靠或错误),我需要删除这些伪影在我制作直方图之前。

我正在使用导入的 xlxs 文件。其中的一列包含适用的数据。

我试过下面的代码

library(data.table)

outlierReplace = function(dataframe, cols, rows, newValue = NA) {  
    if (any(rows)) {  
        set(dataframe, rows, cols, newValue)  
    }  
}  

outlierReplace(X23k_Genome_dNdS_For_R, 
               `manual dN/dS`, 
               which(X23k_Genome_dNdS_For_R$`manual dN/dS` > 3), 
               NA)

这返回了错误代码(如下)

Error in set(dataframe, rows, cols, newValue) :   
  Can't assign to the same column twice in the same query (duplicates detected).  
In addition: Warning message:  
In set(dataframe, rows, cols, newValue) :  
  Coerced j from numeric to integer. Please pass integer for efficiency;   e.g., 2L rather than 2  

强调一下,我有 23k 行,7 列。我正在尝试将“手动 dN/dS”列中高于 3 的所有值替换为 NA

您可能需要安装 data.table 才能使用 set() 函数

样本数据

dat = data.table("seq1"=c("CAA_0000006-RA", "CAA_0000007-RA"), 
                 "seq2"=c("CAB_00000010-RA", "CAB_00000011-RA"),
                 "dN/dS"=c(0.4689, 0.1001), "dN"=c(0.0074, 0.0021),
                 "dS"=c(0.0169,0.0206),
                 "manual dN/dS"=c(0.4379,0.1019),
                 "man. dN/dS w/Nas"=c(0.437869822,0.101941748))

标签: rdata.table

解决方案


library(data.table)    
setDT(dat)
dat[`manual dN/dS` > 3, `manual dN/dS` := NA]

请注意,您的示例数据不包含您在问题中提到的列。

另请注意,列名中的空格和斜杠等特殊字符是不好的做法,因为您总是必须在 R 代码中“引用”名称。

您可以重命名列名,例如。via data.table::setnames(data, "old name", "new name")(请参阅此功能的帮助)


推荐阅读