如何在合并两个数据框时删除相同的列?
考虑以下虚拟示例:
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>
答案 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)