合并重复列并连接列名称

时间:2017-09-06 11:09:57

标签: r dataframe duplicates

我确定这一定是重复的。说我有这个:

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”之间比较的糟糕方式?也许我需要重新塑造以更清楚地表明这一点?

2 个答案:

答案 0 :(得分:6)

使用基数R,您可以对data.frame中唯一的向量集使用match来获取分组,将其提供给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

答案 1 :(得分: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