在R中合并重复的列

4

I have a data frame that is like:

   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列,我不知道哪些列是相同的。因此,我需要一种自动测试列是否相同的方法,并在这种情况下组合列名称。


2
你真的在意列名是否被连接起来,还是最终目标是消除重复的列? - Chris Townsend
1
不错的问题。这可能会有所帮助。在一个数据框中查找具有相同数据的列 - Ronak Shah
2个回答

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))]

此时,df_clean将包含不带任何重复项的数据框。

如果列名确实很重要,那么在查看了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

太好了,谢谢Chris!!对我来说保留列名很重要,因为它们包含了一些重要信息,所以这正是我想要的。 - Liz
1
@Chris,不错的解决方案,这里的digest函数是做什么用的? - thepule
@thepule,digest函数会创建列值的哈希值,并且对于大型数据框而言,应该会减少重复函数的工作量。 - Chris Townsend
@ChrisTownsend 所以这个想法是检查哈希值的重复比检查列重复更快...非常有趣。谢谢。 - thepule

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

这也适用于列可以有多个重复项的情况。

好答案。我选择了另一个答案,因为脚本非常干净优雅,但这个也非常好用!谢谢,thepule! - Liz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接