2017-09-06 48 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