组合数据帧时如何删除相同的列?

时间:2015-10-11 19:27:28

标签: r dataframe

如何在合并两个数据框时删除相同的列?

考虑以下虚拟示例:

data(iris)
iris2 <- iris 
iris2[ 2:7, c(1,3,5)] <- NA
Xa <- cbind(iris, iris2)
head(Xa)
##  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##1          5.1         3.5          1.4         0.2  setosa          5.1         3.5          1.4         0.2  setosa
##2          4.9         3.0          1.4         0.2  setosa           NA         3.0           NA         0.2    <NA>
##3          4.7         3.2          1.3         0.2  setosa           NA         3.2           NA         0.2    <NA>
##4          4.6         3.1          1.5         0.2  setosa           NA         3.1           NA         0.2    <NA>
##5          5.0         3.6          1.4         0.2  setosa           NA         3.6           NA         0.2    <NA>
##6          5.4         3.9          1.7         0.4  setosa           NA         3.9           NA         0.4    <NA>

删除具有相同名称的列非常容易:

Xa <- Xa[ , !(duplicated(names(Xa)))]
head(Xa)
##  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##1          5.1         3.5          1.4         0.2  setosa
##2          4.9         3.0          1.4         0.2  setosa
##3          4.7         3.2          1.3         0.2  setosa
##4          4.6         3.1          1.5         0.2  setosa
##5          5.0         3.6          1.4         0.2  setosa
##6          5.4         3.9          1.7         0.4  setosa

但并非所有删除的列都具有相同的内容。如何从数据框中删除相同的列(同名相同的内容)?

预期结果是:

##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species   Sepal.Length   Petal.Length   Species
## 1          5.1         3.5          1.4         0.2  setosa            5.1            1.4    setosa
## 2          4.9         3.0          1.4         0.2  setosa             NA             NA      <NA>
## 3          4.7         3.2          1.3         0.2  setosa             NA             NA      <NA>
## 4          4.6         3.1          1.5         0.2  setosa             NA             NA      <NA>
## 5          5.0         3.6          1.4         0.2  setosa             NA             NA      <NA>
## 6          5.4         3.9          1.7         0.4  setosa             NA             NA      <NA>

2 个答案:

答案 0 :(得分:2)

你可以做到

Xa[!duplicated.default(Xa)]
# or
Xa[, !duplicated.default(Xa)]
# or, as mentioned by @akrun in a comment
Xa[!duplicated(c(Xa))]

无论哪种方式,都会自动重命名列(通常为data.frame()),以便它们之间不再有任何欺骗。

我们不能在这里使用vanilla duplicated,因为它会使用duplicated.data.frame来比较行以查找重复项,而duplicated.default则会比较向量的元素。 data.frame是(向量)列向量的向量,因此duplicated.default在这种情况下起作用的原因。 duplicated(c(Xa))duplicated(as.list(Xa))也有效,因为他们会将Xa从data.frame更改为vanilla向量。

答案 1 :(得分:0)

根据接受的答案,我想出了一个非常简单的功能来完成这项任务:

rm.df.dupl <- function(x){
    stopifnot(is.data.frame(x))
    x <- x[ , !duplicated.default(x)]
    return(x)
}

现在你所要做的就是:

rm.df.dupl(Xa)