我确定这一定是重复的。说我有这个:
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 :(得分:6)
使用基数R,您可以对data.frame中唯一的向量集使用match
来获取分组,将其提供给split
,并将变量的名称作为第一个参数要按组拆分名称,请使用sapply
和paste
连接每个组中的变量名称,然后使用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