【发布时间】:2016-08-03 16:23:07
【问题描述】:
今天早上在对数据框进行一些分析时,由于存在重复的列名,我遇到了一个错误。我试图找到一个专门使用 dplyr 的解决方案,但我找不到任何可行的方法。这里有一个例子来说明这个问题。具有重复列名的数据框。
x <- data.frame(matrix(c(1, 2, 3),
c(2,2,1),nrow=2,ncol=3))
colnames(x) <- c("a", "a", "b")
当我尝试使用 select 命令删除第一列时出现错误
x %>%
select(-1)%>%filter(b>1)
Error: found duplicated column name: a
我可以使用传统索引和使用 dplyr 按值过滤轻松摆脱列
x<-x[,-1]%>%filter(b>1)
产生所需的输出
> x
a b
1 2 3
2 2 3
关于如何仅使用 dplyr 语法来执行此操作的任何想法?
【问题讨论】:
-
那么在基础 R 中,“正确”的方式可能是
x[!duplicated(names(x), fromLast=TRUE)]。只需找到一种方法将其放入 dplyr 的select动词中即可。嗯,即使x %>% select(2,3)也不起作用,在查看select子句之前抱怨LHS。我称之为错误。粗略的解决方法:x %>% do(.[!duplicated(names(.), fromLast=TRUE)]) -
我通常只使用
make.names合法地重命名所有内容。 -
如果你仔细研究一下,我想你会发现这里的祸根在于 plyr 和 dplyr 使用列名来选择数据。这要求列具有唯一的名称,它不按名称和内容进行选择。基本包使用索引,它可以在不考虑命名范式的情况下工作。这是包装的限制,大部分时间都值得限制。
-
是的,我得出了这个结论,有趣的是,您不能删除同名的列,但实际上可以创建同名的列,为了保持一致,这也应该引发错误消息.