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

方法を返す

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

は '' exp5'のではなく、 'exp1'または' exp2'のexp3'重複しているのですか? – PoGibas

+1

ああ、大きな間違い申し訳ありません! – Pete900

答えて

6

、あなたはsplitにこれを送り、グループを取得するにはdata.frame中のベクトルの固有のセットにmatchを使用することができ、グループ名を分割する最初の引数として変数の名前を使用して、sapplypasteを使用して、各グループの変数名を連結してからsetNamesを使用して、列のセット。

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) 

与える:基本Rで

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