2016-03-18 16 views
0

私はRを使った数式では新しく、いくつかの反復コードをよりコンパクトなものに変更するのにかなり苦労しています。 MrFlickのコメントで示唆されているように、私はすでに答えのセクションで見つかった作業ソリューションを投稿しました。R textminingデータフレームのサブセットで構造化されたコーパスを構築する

私の問題は、ここではwikispiral.orgで見ることができるように、いくつかの異なる分類を使用して、比較対象のワードクラウドにさまざまなコーパスを作成することです。このためには、元のデータフレームのサブセット(データフレームに存在するカテゴリ)に基づいて文字ベクトルのリストを作成する必要があります。次の例を参照してください:

element    qty category1 category2 
1 Adams Pearmain  2 Red   small 
2 Aia Ilu    1 Green  big 
3 Airlie Red Flesh 4 Red   small 
4 Akane    3 Green  big 
5 Åkerö    6 Yellow  small 
6 Alkmene    2 Orange  big 
7 Allington Pippin 1 Red   small 
8 Ambrosia   4 Red   big 
9 Anna    3 Green  small 
10 Annurca    6 Red   big 
11 Antonovka   2 Green  small 
12 Apollo    1 Yellow  big 
13 Ariane    4 Green  small 
14 Arkansas Black  3 Yellow  big 
15 Arthur Turner  6 Orange  big 

私は現在のようなwordcloudためのベクターの私のリストを作成しています:

## Subsetting two dataframes to category2 values 
wordBig <- d[d$category2 == "big",] 
wordSmall <- d[d$category2 == "small",] 

## Extracting the vectors in the category1 columns 
wordSmall <- as.vector(wordSmall$category1) 
wordBig <- as.vector(wordBig$category1) 

## Building the list for the corpus 
wordALL <- list(wordBig, wordSmall) # Without list() it doesn' t work 

そして最後に:

このデータフレームを与える

library(wordcloud) 
library(tm) 

element <- c("Adams Pearmain ", "Aia Ilu ", "Airlie Red Flesh", "Akane ", "Åkerö ", "Alkmene", "Allington Pippin ", "Ambrosia ", "Anna ", "Annurca ", "Antonovka ", "Apollo ", "Ariane ", "Arkansas Black ", "Arthur Turner") 
qty <- c(2, 1, 4, 3, 6, 2, 1, 4, 3, 6, 2, 1, 4, 3, 6) 
category1 <- c("Red", "Green", "Red", "Green", "Yellow", "Orange", "Red", "Red", "Green", "Red", "Green", "Yellow", "Green", "Yellow", "Orange") 
category2 <- c("small", "big", "big", "small", "small", "medium", "medium", "medium", big", "big", "small", "medium", "big", "very big", "medium") 
d <- data.frame(element=element, qty=qty, category1=category1, category2=category2) 

コーパス< - Corpus(VectorSource(wordALL)、readerControl = list(language = "実際にはwikispiral.orgの例では、カテゴリが「ビッグ」または「スモール」だけでなく、ウェブサイトのユーザーによって定義されたカテゴリの動的配列もあります。非常に予測不可能です)。固定されたカテゴリであっても、コードは反復的で醜いものになり、エラーを避けるために各次元の存在をテストしなければならなかった。comparative.wordcloud()はカテゴリにNAsがある場合(「大きな」カテゴリのデータがない場合)

だから私の質問は:することができ、よりコンパクトなコードに前例の例を変換する方法: 1 - 分類欄 2でカテゴリを検出 - 文字ベクトル 3のリストを作成する - 多分やりますこのループを回避する...

MrFlickのアドバイスに従って回答セクションに記入した回答が見つかりました。

+0

リクエストは[codereview.se]、スタックオーバーフローではないに属しています。特定のプログラミング問題に焦点を当てるように質問を編集する方がよいでしょう。あなたの解決策をレビューするように他の人に依頼するのではなく、別の解決策に同意した場合や他の解決策を投稿した場合に他の人が投票できる回答を貼り付けることができます。 – MrFlick

+0

'd $ category2'の第2引数で' split'を使って "sub-data.frames"のリストを作成し、それらのサブセットで作業します。 –

+0

あなたのご意見ありがとうございました。 –

答えて

0

OK、彼のコメントで42の提案に続いて、それは確かに迅速かつクリーナーです...

listtest <- split(d,d$category2) 
listtest <- lapply(listtest, droplevels.data.frame) 
wordALL <- lapply(listtest, "[[", "element") 

そしてそこには、コーパスを構築する準備ができて、データフレームから、要因のリストです:コードレビューのための

corpus <- Corpus(VectorSource(wordALL), readerControl = list(language = "fr")) 
0

私は、このリストを構築するための関数を作成しました。これは、メインデータフレームから文字ベクトルをサブセット化してリストを作成するforループを使用して作成されました。私はそれをより一般的なものにするために私の機能を更新したので、他の人がアプリケーションを構築するのを助けるために再利用することができます。

CorpusFromDF <- function(DF, textcol, catcol) { 
    # DF = a dataframe 
    # wordcol = the name of a column from DF containing the text to build the corpus 
    # catcol = the name of a column from DF containing the categorisation 
    cat <- levels(DF[,catcol]) 
    list <- list() 
    for (n in cat){ 
    temp <- DF[DF[,catcol] == n,] 
    temp <- as.vector(temp[,textcol]) 
    list <- append(list, list(temp)) 
    } 
    return(list) 
} 

そして、それを使用する:

wordALL <- CorpusFromDF(d, "element", "category2") 

それが動作するので、だから私は本当に嬉しい(それはすべての後に私の最初のR関数です)、私は、私は必要なもの含むベクターのリストを持っています言葉。そこから、私はいくつかの異なるカテゴリ/分類を使用してネットワーク分析を構築するために、特にこれを再利用してコーパスを再構成することができます。

しかし完璧ですが、特にコーパスを構築するために本当にたくさんのカテゴリがある場合は、ループを使用しなくても可能性があると推測しています...他のアプリケーションの場合はどうなりますか? 。

関連する問題