从data.frame中删除列,然后创建具有类似名称的新列

时间:2015-07-21 15:11:28

标签: r dataframe

我刚刚在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正在使用旧的过时列中的部分列名来代替调用更新的列。

1 个答案:

答案 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