subset函数返回所有行

时间:2017-04-24 15:51:16

标签: r dataframe subset quote

出于兼容性原因,我最近恢复了R版本3.1.3,现在遇到了子集函数无法解释的错误。

我想提取基因的所有行" Migut.A00003"来自数据框transcr_effects使用数据框expr_mim_genes中列出的基因名称。 (这将成为一个循环)。无论子集查找的格式如何,此操作始终返回所有行而不是我要查找的特定行:

> class(expr_mim_genes)
[1] "data.frame"

> sapply(expr_mim_genes, class)
       gene  longest.tr pair.length 
"character"   "logical"   "numeric" 

> head(expr_mim_genes)
          gene longest.tr pair.length
1 Migut.A00003         NA           0
2 Migut.A00006         NA           0
3 Migut.A00007         NA           0
4 Migut.A00012         NA           0
5 Migut.A00014         NA           0
6 Migut.A00015         NA           0

> class(transcr_effects)
[1] "data.frame"

> sapply(transcr_effects, class)
       pair        gene 
"character" "character" 

> head(transcr_effects)
       pair         gene
1     pair1 Migut.N01020
2    pair10 Migut.A00351
3  pair1000 Migut.F00857
4 pair10007 Migut.D01637
5 pair10008 Migut.A00401
6 pair10009 Migut.G00442
. . .
7168 pair3430 Migut.A00003
. . .

我感兴趣的基因:

> expr_mim_genes[1,"gene"]
[1] "Migut.A00003"

R认为这两个术语是等价的:

> expr_mim_genes[1,"gene"] == "Migut.A00003"
[1] TRUE

如果我手动输入基因名称,则会返回正确的行数:

> nrow(subset(transcr_effects, transcr_effects$gene=="Migut.A00003"))
[1] 1
> subset(transcr_effects, transcr_effects$gene=="Migut.A00003")
         pair         gene
7168 pair3430 Migut.A00003

但是,这应该从data.frame返回一行,但它返回所有行:

> nrow(subset(transcr_effects, transcr_effects$gene == (expr_mim_genes[1,"gene"]))
[1] 10122

我觉得这与文本格式有关,但我已经尝试过所有内容并且无法解决这个问题。引用v.s.我已经看到了这个问题。不带引号的条目,但它似乎不是这里的问题(见上面的相等)。

在切换到R v.3.1.3之前我没有遇到这个问题,所以也许这是我不知道的版本约定?

编辑: 这让我发疯,但至少我觉得我找到了补丁。在代码中有相当多的数据和文件处理到达这一点,涉及加载至少4个文件。我已尝试将每个文件的片段用于在此处发布可重现的示例,但有时当我分析片段时错误再次发生,有时它不会(!!)。经过这个过程后,我发现:

i = 1
gene = expr_mim_genes[i,"gene"]

> nrow(subset(transcr_effects, gene == gene))
[1] 10122
> nrow(subset(transcr_effects, gene == (expr_mim_genes[i,"gene"])))
[1] 1

我仍然无法解释代码的这种行为,但至少我知道如何解决它。 谢谢大家。

0 个答案:

没有答案