出于兼容性原因,我最近恢复了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
我仍然无法解释代码的这种行为,但至少我知道如何解决它。 谢谢大家。