2016-07-16 6 views
3

私はこの(ID、周波数B C D E)のようなデータフレームを有するRを使って周波数をテキストに変換するには?

ID A B C D E  
1 5 3 2 1 0 
2 3 2 2 1 0 
3 4 2 1 1 1 

私はこのようなテストベースのドキュメント(単一の列内の単語としてIDとその周波数ABCDE)にこのデータフレームに変換します。次に、LDAアルゴリズムを使用して、各IDのホットトピックを特定することができます。

ID      Text 
1 "A" "A" "A" "A" "A" "B" "B" "B" "C" "C" "D" 
2 "A" "A" "A" "B" "B" "C" "C" "D" 
3 "A" "A" "A" "A" "B" "B" "C" "D" "E" 

答えて

1

我々はdata.table

library(data.table) 
DT <- setDT(df1)[,.(list(rep(names(df1)[-1], unlist(.SD)))) ,ID] 
DT$V1 
#[[1]] 
#[1] "A" "A" "A" "A" "A" "B" "B" "B" "C" "C" "D" 

#[[2]] 
#[1] "A" "A" "A" "B" "B" "C" "C" "D" 

#[[3]] 
#[1] "A" "A" "A" "A" "B" "B" "C" "D" "E" 

を使用することができますかbase Rオプションがsplit

lst <- lapply(split(df1[-1], df1$ID), rep, x=names(df1)[-1]) 
lst 
#$`1` 
#[1] "A" "A" "A" "A" "A" "B" "B" "B" "C" "C" "D" 

#$`2` 
#[1] "A" "A" "A" "B" "B" "C" "C" "D" 

#$`3` 
#[1] "A" "A" "A" "A" "B" "B" "C" "D" "E" 
です

1つのオプション(data.frameが同じ長さ(列とlistのように)data.frameへの変換中に長さを等しくするために最後にNAを追加することによってdata.framelistに変換され、我々はcsvファイルに「LST」を書きたい場合)

res <- do.call(rbind, lapply(lst, `length<-`, max(lengths(lst)))) 

それともwrite.csv

を使用し、その後 stringi

library(stringi) 
res <- stri_list2matrix(lst, byrow=TRUE) 

から便利な機能を使用し、

write.csv(res, "yourdata.csv", quote=FALSE, row.names = FALSE) 
1

あなたはとても似applyrepを使用することができます:applyは、各変数の名前を繰り返すrep機能を何度も供給し、行ごとに

apply(df[-1], 1, function(i) rep(names(df)[-1], i)) 

[[1]] 
[1] "A" "A" "A" "A" "A" "B" "B" "B" "C" "C" "D" 

[[2]] 
[1] "A" "A" "A" "B" "B" "C" "C" "D" 

[[3]] 
[1] "A" "A" "A" "A" "B" "B" "C" "D" "E" 

各リスト要素は、data.frameの行です。

データ

df <- read.table(header=T, text="ID A B C D E  
1 5 3 2 1 0 
2 3 2 2 1 0 
3 4 2 1 1 1") 
+0

ありがとうございました。もう一つ質問があります:出力をCSVに書き込む方法。資料? –

+0

csvsは長方形のデータを必要とするため、リストはcsvに書き込むように設計されていません。 Rで作業している場合は、 'write.csv'と' read.csv'より 'save'と' load'を使うべきです。あなたがcsvに書き込む必要があり、これが最初の質問から範囲外である場合、私はこれが投稿するには素晴らしい第二の質問をするだろうと思う。これらの回答から受け取ったリストデータから始めます。私は同じものが存在すると確信していますが、それを見つけることはできませんでした。 – lmo

関連する問題