2016-03-18 50 views
0

R ile formüllerde yeniyim ve bazı yinelenen kodları daha kompakt bir şeye dönüştürmek için biraz uğraşıyorum. MrFlick'in yorumunda da belirtildiği gibi, cevap bölümünde bulduğum çalışma çözümünü yayınladım. Bu nedenle, wikispiral.org numaralı belgede görebileceğiniz gibi, farklı kategorileri kullanarak karşılaştırmalı bir wordcloud için çeşitli yazılımlar oluşturmak benim sorunum. Bunun için orijinal veri çerçevesinin alt kümelerini (veri çerçevesinde mevcut olan kategoriler) temel alan bir karakter vektörleri listesi oluşturmam gerekiyor. Aşağıdaki örneğe bakın:R textmining, bir veri kümesinin alt kümeleriyle yapılandırılmış bir yapı oluşturuyor

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 

Şu anda gibi Wordcloud için vektörlerin listemi oluşturma:

## 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 

Ve nihayet:

bu dataframe verir

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 < - Dergi (VectorSource (wordALL), readerControl = liste (dil = " fr "))

Gerçek hayattaki örneğim wikispiral.org içinde, dinamik bir boyut dizisi vardır - yalnızca" büyük "veya" küçük "kategorileri değil (ve bu kategorilerin bazıları web sitesinin kullanıcıları tarafından tanımlanır, ve oldukça öngörülemez). Sabit kategoriler için bile kod tekrarlı ve çirkinleşiyordu ve bir kategorideki NA'lar varsa ("büyük" kategorisinde veri yok gibi) bir hatadan kaçınmak için her bir boyutun varlığının test edilmesi gerekiyordu. comparative.wordcloud().

Benim soru yani: yapabiliyor daha kompakt kodu içinde emsal örnek dönüştürmek için nasıl: 1 - sınıflandırma sütununda kategoriler tespit 2 - karakterinin listesi oluşturabilir vektörleri 3 - Belki do döngülerden kaçınmak ...

BayFlick'in tavsiyesi üzerine cevaplar bölümüne koyduğum bir cevabı zaten buldum.

+0

İsteği [codereview.se] üzerine aittir taşması Stack değil. Sorunuzu belirli bir programlama sorusu üzerine odaklanmak daha iyi olurdu. Başkalarının çözümünüzü incelemesini istemekten ziyade, yapıştırabileceğiniz diğer kişilerin, alternatif çözümlere katılıp katılmadıklarında oy kullanabilecekleri bir yanıttır. – MrFlick

+0

"alt data.frames" in bir listesini oluşturmak için "d $ category2" ikinci argümanı ile 'split 'kullanın ve sonra bu alt kümelerde çalışın. –

+0

Yorumlarınız için teşekkürler, cevaplarımda da görebileceğiniz gibi, çok yardımcı oldu. –

cevap

0

Tamam, 42'nin önerisi hakkındaki önerisini takip ederek, gerçekten daha hızlı ve daha temiz ...

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

Ve orada, bir dataframe gelen, bir külliyat oluşturmak için hazır faktörlerin bir listesi: Kod incelenmek üzere

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

Bu listeyi, ana veri çerçevesinden karakter vektörlerini yerleştiren ve listeyi dolduran bir for döngüsü kullanarak oluşturmak için bir işlev oluşturdum. İşlevlerimi daha genel olması için güncelledim, böylece diğerleri uygulamalarını oluşturmaya yardımcı olmak için yeniden kullanabilir.

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) 
} 

Ve zaman kullanılır?

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

Yani ben çalışır çünkü gerçekten mutluyum (sonuçta benim ilk R fonksiyonudur), ben içeren vektörlerin listesi ne gerek var sözler. Oradan, özellikle farklı kategoriler/sınıflandırmalar kullanarak ağ analizi tekstümanı oluşturmak için, yazılımlarımı yeniden şekillendirmek için bunu yeniden kullanabilirim.

Ama bu mükemmel bir çözümdür ve sanırım özellikle çok fazla kategoriye sahip olduğunuzda ilmek kullanmadan bir olasılık olabileceğini tahmin ediyorum… Diğer uygulamalar için benim durumum ne olacak ..