【发布时间】:2022-01-17 01:57:13
【问题描述】:
所以我有一个包含几个不同类别的大型数据框,下面是一个简化示例(真正的数据集有 10 多个不同的组织,15 多个不同的独特细胞类型,每个组织具有可变长度的名称,以及数千个基因)。组织列被格式化为因子。
GENENAME Tissue1 Tissue2 Tissue3
Gene1 CellType_AA CellType_BB CellType_G
Gene2 CellType_AA CellType_BB <NA>
Gene3 CellType_AA <NA> <NA>
Gene4 CellType_AA CellType_BB CellType_G
Gene5 <NA> <NA> CellType_G
Gene6 <NA> CellType_BB CellType_H
Gene7 CellType_AC CellType_BD CellType_H
Gene8 <NA> <NA> CellType_H
Gene9 CellType_AC CellType_BD <NA>
Gene10 <NA> CellType_BB <NA>
Gene11 <NA> CellType_BD CellType_H
Gene12 CellType_AC <NA> <NA>
Gene13 <NA> CellType_E CellType_I
Gene14 CellType_F CellType_E CellType_I
Gene15 CellType_F CellType_E <NA>
我想要做的是根据多个组织中存在的 CellTypes 返回一个子集,并在我这样做时忽略不必要的列。此外,我想使用通配符(在下面的示例中,CellType_A*,以便同时选择CellType_AA 和CellType_AB),并在我只指定一些列时忽略其他列。我希望该函数可以轻松地用于不同的细胞类型组合,因此为每一列添加了一个单独的变量。
为此,我设置了下面的函数,将每个变量的默认值设置为"*",认为如果我不指定输入,它会将这些列中的任何一个视为有效。
Find_CoEnrich <- function(T1="*", T2="*", T3="*"){
subset(dataset,
grepl(T1, dataset$Tissue1)
&grepl(T2, dataset$Tissue2)
&grepl(T3, dataset$Tissue3)
,select = GENENAME
)
}
但是,当我只在单个列上运行该函数时,要对其进行测试
Find_CoEnrich(T1="CellType_AA")
它只会返回以下内容:
GENENAME
1 Gene1
4 Gene4
而不是
1 Gene1
2 Gene2
3 Gene3
4 Gene4
跳过另一列中包含NA 的任何行。更神秘的是,如果我尝试使用通配符,它似乎会忽略字符串的其余部分,只返回每行中都有值的行,即使它们与字符串的其余部分不匹配,如 Gene14 :
Find_CoEnrich(T1="CellType_A*")
GENENAME
1 Gene1
4 Gene4
7 Gene7
14 Gene14
我很确定是表中存在NA 导致了问题,但是我花了很长时间试图纠正这个问题并且已经没有耐心了。如果有人可以提供帮助,将不胜感激。
【问题讨论】:
-
c"*"应该是c("*")吗?请确保您在将代码发布到问题中之前已经对其进行了测试,通过问题中的简单拼写错误导致的语法错误可能会令人沮丧,并且并不总是清楚它们不是您真实代码中的错误。跨度> -
复制示例数据时,版本之间出现复制粘贴错误,抱歉,现已修复。
-
它只返回那些行,因为其他行有缺失值 (
NAs)! -
是的,我知道,我想知道如何告诉代码只关注我指定的列。我认为将默认变量设置为通配符
*会使其接受这些列中的任何内容,因此只会对我指定的变量进行子集化,但我不知道如何使通配符也适用于NA -
如果您期望基因 2 和 3,那么这表明在这些字段中有
NA应该允许匹配。但是,按照这种逻辑,这意味着基因 5、6、8、10、11 和 13 也应该匹配。我认为您需要考虑和/或更好地沟通在您的逻辑中应如何考虑NA值。