2017-09-06 24 views
2

我确定这必须是重复的。说我有这个:合并重复的列和连接列名

stage <- seq(1,3,1) 
exp1 <- c("A","B","C") 
exp2 <- c("A","B","C") 
exp3 <- c(NA, "B","C") 
exp4 <- c("D","B","C") 
exp5 <- c("A","B","C") 
exp6 <- c(NA, "B","C") 

df <- data.frame(stage, exp1, exp2, exp3, exp4, exp5, exp6) 

    stage exp1 exp2 exp3 exp4 exp5 exp6 
1  1 A A <NA> D A <NA> 
2  2 B B B B B B 
3  3 C C C C C C 

我想合并所有重复的列,并通过连接列名显示此。我能找到的重复列with

df[duplicated(lapply(df, summary))] 

exp2 exp5 exp6 
1 A A <NA> 
2 B B B 
3 C C C 

但我无法弄清楚如何复制的列名相结合,使得我得到这样的:

stage exp1_exp2_exp5 exp3_exp6 exp4 
1  1    A  <NA> D 
2  2    B   B B 
3  3    C   C C 

或许(可能),这是一个糟糕的方式来可视化不同“exp”之间的比较?也许我需要重塑,以更清楚地表明这一点?

+0

如何是'exp3'重复'exp5',但不是'exp1'或'exp2'? – PoGibas

+1

啊大错误对不起! – Pete900

回答

6

随着基础R,您可以在唯一的一组向量的使用match在data.frame拿到分组,喂这split,将变量的名称作为第一个参数来按组拆分名称,请使用sapplypaste连接每个组中的变量名称,然后使用setNames将名称提供给唯一一组列。

setNames(as.data.frame(unique(as.list(df))), 
     sapply(split(names(df), match(as.list(df), unique(as.list(df)))), 
       paste, collapse="-")) 

返回

stage exp1-exp2-exp5 exp3-exp6 exp4 
1  1    A  <NA> D 
2  2    B   B B 
3  3    C   C C 
4

寻找类似的东西?

library(dplyr) 
library(tidyr) 
df %>% 
    gather(variable, value, -1) %>% 
    group_by(variable) %>% 
    summarise(values = paste(sort(value), collapse = ',')) %>% 
    group_by(values) %>% 
    summarise(cols = paste(variable, collapse = '_')) %>% 
    separate_rows(values) %>% 
    left_join(df %>% gather(variable, value, -1, na.rm = TRUE), ., by = c('value'='values')) %>% 
    select(-variable) %>% 
    distinct() %>% 
    spread(cols, value) 

这给:

stage exp1_exp2_exp5 exp3_exp6 exp4 
1  1    A  <NA> D 
2  2    B   B B 
3  3    C   C C 
+0

虽然这并不完全是我提供了一种不同的方法,对我来说非常有用。所以谢谢。 – Pete900

+0

现在是啊。但是,我仍然喜欢你给出的第一个答案,因为它用普通的字母组将“exp”分组。我仍然可以从编辑页面获取代码。 – Pete900

+0

已更新。现在它提供了正确的输出,尽管@ lmo的解决方案要短得多。 – Jaap