2015-01-06 119 views
5

サンプルデータを作成します。回以上現れるIDごとRデータフレーム内の文字列にリストの列を強制変換

id <- c(12, 32, 42, 42, 52, 52, 67, 67) 
relationship_id <- c(15,1,59,1,61,6,59,1) 
sample.data <- data.frame(id,relationship_id) 

をrelationship_idを連結:

combo <- aggregate(relationship_id ~ id, data = sample.data, paste, sep=",") 
table(combo$relationship_id) 
Error in table(combo$relationship_id) : 
    all arguments must have the same length 

私は考え出しこのエラーの原因:

class(combo$relationship_id) 
[1] "list" 

しかし、リストベクトルを文字ベクトルに強制しようとすると、次のようになります。

combo["relationship_id"] <- lapply(combo["relationship_id"], as.character) 
> head(combo)  
    id relationship_id 
1 12    15 
2 32    1 
3 42 c("59", "1") 
4 52 c("61", "6") 
5 67 c("59", "1") 

これは連結構文を含んでいます...出力を解析して使用できるようにすることができますが、なぜこれが起こっているのですか?出力をクリーンアップする簡単な方法はありますか?

+0

'sep'を' collapse'に変更すると、期待したことができるはずです。 – A5C1D2H2I1M1N2O1R2T1

+1

SOに関する最初の質問として、再現性のある質問がうまく機能します。 (+1) – A5C1D2H2I1M1N2O1R2T1

答えて

4

あなたは間違った問題に取り組もうとしています。これらの値を単一の文字ベクタに縮小したい場合は、sepの代わりにcollapse = ","を使用する必要があります。

combo <- aggregate(relationship_id ~ id, data = sample.data, 
        paste, collapse=",") 
table(combo$relationship_id) 
# 
# 1 15 59,1 61,6 
# 1 1 2 1 
+0

私はそのような場合に 'toString'を好きです。 –

+0

私は 'paste'がより透明で広く使われるようになっていますが、それは好みの問題だと思います。 – A5C1D2H2I1M1N2O1R2T1

関連する問題