我刚刚在R版本3.1.3和RStudio版本0.98.1091中遇到了一个奇怪的问题(它可能已经存在于以前的版本中)。
我有一个测试数据框架的蛋白质有很多列,其中一个叫做“Peptide.IDs”,并列出旧的,过时的肽文件中的ID 。这些ID列为以分号分隔的字符串。因为我已经创建了具有不同ID的我自己的肽文件,所以我删除了该列:
test$Peptide.IDs <- NULL
然后我创建了一个新列来编译我自己的ID作为列表:
test$Peptide.IDs.list <- sapply(test$Evidence.IDs.list, function(x) {x <- unlist(temp2$Peptide.ID[which(temp2$id %in% x)])
x <- unique(x)
})
然而,当我尝试“ctrl + Enter”文本 test $ Peptide.IDs ,而不是正常返回 NULL 时,Rstudio显示<的内容b> test $ Peptide.IDs.list ,即列表。
所以看起来R正在使用旧的过时列中的部分列名来代替调用更新的列。
答案 0 :(得分:2)
这不是错误。这是预期的行为。
&#34;问题&#34;是$
运算符允许部分的前导匹配(如果它是唯一的)。在您的情况下,Peptide.IDs
仅匹配Peptide.IDs.list
,因为将NULL
分配给列从数据框中删除列。
> d <- data.frame(a = 1)
> d$a.a <- 2
> d$a <- NULL # Removes column `a`, leaving only `a.a`
> d$a # column `a.a` is retrieved
[1] 2
要解决此问题,请使用[[
运算符代替$
。它不执行部分匹配:
> d[['a']] # Not found returns NULL
NULL
> d[['a.a']]
[1] 2