我有一个类似的数据框:
c1 c2 c3 c4
r1 1 0 1 1
r2 0 0 1 1
r3 0 1 0 0
在这种情况下,c3和c4完全相同。我想删除重复的列,但保留c3和c4的列名,以获取数据框:
c1 c2 c3c4
r1 1 0 1
r2 0 0 1
r3 0 1 0
其中第三列名称连接相同列的列名。
我觉得应该有一种优雅的方式来做到这一点我无法想到。任何帮助将不胜感激!
编辑:只是为了澄清,我的实际数据框实际上是1000行x 1000列,我不知道哪些列是相同的。所以我需要一种自动测试方法,如果列是相同的,那么组合列名的情况就是这样。
答案 0 :(得分:2)
额外的信息增加了一个有趣的皱纹!如果您不关心连接列的名称,可以执行以下操作:
df <- data.frame(c1 = c(1,0,0), c2 = c(0,0,1), c3 = c(1,1,0), c4 = c(1,1,0), c5 = c(1,1,1), c6= c(1,1,1), c7 = c(2,2,2))
library(digest)
df_clean <- df[!duplicated(lapply(df, digest))]
如果列名真的很重要,那么在查看thepule的答案后,我就会这样做:
df_dups <- df[duplicated(lapply(df, digest))] #extract the duplicates
for (clean_col in 1:ncol(df_clean)){
for (dup_col in 1:ncol(df_dups)){
if (identical(df_clean[,clean_col], df_dups[,dup_col]) == TRUE){
colnames(df_clean)[clean_col] <- paste(colnames(df_clean)[clean_col], colnames(df_dups)[dup_col], sep = "")
}
}
}
添加了用于测试的附加重复项的输出如下所示:
'data.frame': 3 obs. of 5 variables:
$ c1 : num 1 0 0
$ c2 : num 0 0 1
$ c3c4: num 1 1 0
$ c5c6: num 1 1 1
$ c7 : num 2 2 2
答案 1 :(得分:1)
它可能不是一个超级优雅的解决方案,但它完成了工作。
如果df
是您的数据框:
dups <- duplicated(lapply(df, function(x) x))
df_clean <- df[!dups]
df_dups <- df[dups]
for(z in 1: ncol(df_clean)){
i <- names(df_clean)[z]
df_clean[i] -> q
d <- which(
sapply(df_dups, function(x) {
ifelse(identical(x,as.vector(sapply(q, function(x) x))), T, F)
})
)
names(df_clean)[z] <- paste0(i, paste(names(df_dups)[d], collapse = ""))
}
输出结果为:
df_clean
c1 c2 c3c4
r1 1 0 1
r2 0 0 1
r3 0 1 0
如果列可以有多个重复项,这也应该有用。