2016-11-09 7 views
0

私は20列のデータフレームを持っています。最後の列はテキストフィールドです。私は最初の19列でグループ化し、最後のテキスト列の値を連結したいと思います。 私は次のようにdplyr使用してこれを達成しようとしている:1つの列でグループ化して連結することによってデータフレームを折りたたむ方法

mydf %>% 
group_by(col1, col2, col3, ... col19) %>% 
summarise(alltasks = c(col20)) 

をしかし、これは、このエラーメッセージを表示して動作してリターンしません:evalの中

エラー(代替(expr)は、ENVIR、エンクロージャ):シングルを期待する 値

私は間違っていますか?

+1

'C'は、ちょうど 'summarise'が必要のような単一の合計値ではないれ、各グループ内のすべての値を返します。おそらく 'summary(alltasks = toString(col20))' – thelatemail

+1

'paste'か' toString'を試してみてください。 –

答えて

4

@thelatemailが指摘するように、すべての値のベクトルではなく、単一の値を返す必要があります。ここではそれを行う方法の例を示します。

dots = lapply(paste0("col", 1:19), as.symbol) 

mydf %>% 
    group_by_(.dots=dots) %>% 
    summarise(alltasks = paste(col20, collapse=", ")) 

summariseラインへの変更は、単一の文字列にまとめcol20からすべての値を貼り付ける方法です。コンマ区切り記号を使用しましたが、好きなものに変更することはもちろん可能です。 dotsビジネスは、それぞれを入力せずにすべてのグループ化変数を組み合わせるほうが簡単です。

mydfの名前は、あなたがそれらを生成するために、単純なpaste機能を使用できるように、定期的にされていない場合、他のオプションは、たとえば、次のようになります。

dots = lapply(names(mydf)[1:19], as.symbol) 

または

dots = lapply(names(mydf)[-grep("col20$", names(mydf))], as.symbol) 

ここです組み込みのmtcarsデータフレームを使用するdplyrコードの実例:

dots = lapply(c("am","vs","cyl","carb"), as.symbol) 

mtcars %>% 
    group_by_(.dots=dots) %>% 
    summarise(all_mpg = paste(mpg, collapse=", ")) 
 am vs cyl carb      all_mpg 
1  0  0  8  2  18.7, 15.5, 15.2, 19.2 
2  0  0  8  3    16.4, 17.3, 15.2 
3  0  0  8  4 14.3, 10.4, 10.4, 14.7, 13.3 
4  0  1  4  1       21.5 
5  0  1  4  2     24.4, 22.8 
6  0  1  6  1     21.4, 18.1 
7  0  1  6  4     19.2, 17.8 
8  1  0  4  2       26 
9  1  0  6  4      21, 21 
10  1  0  6  6       19.7 
11  1  0  8  4       15.8 
12  1  0  8  8       15 
13  1  1  4  1  22.8, 32.4, 33.9, 27.3 
14  1  1  4  2    30.4, 30.4, 21.4 
+1

ありがとうございます。これは非常に役に立ち、私が探していたものです –

関連する問題