2016-07-12 12 views
0

Ich habe dieses Dokument Begriff Matrix aus Paket R {tm}, die ich auf as.matrix erzwungen habe. MWE hier:Subsetting eine Matrix, Adressierung colnames

> inspect(dtm[1:ncorpus, intersect(colnames(dtm), thai_list)]) 
<<DocumentTermMatrix (documents: 15, terms: 4)>> 
Non-/sparse entries: 17/43 
Sparsity   : 72% 
Maximal term length: 12 
Weighting   : term frequency (tf) 

Terms 
Docs toyota_suv gmotors_suv ford_suv nissan_suv 
1  0  1  0   0 
2  0  1  0   0 
3  0  1  0   0 
4  0  2  0   0 
5  0  4  0   0 
6  1  1  0   0 
7  1  1  0   0 
8  0  1  0   0 
9  0  1  0   0 
10  0  1  0   0 

Ich brauche diese as.matrix(dtm) der Teilmenge, so dass ich nur Dokumente (Zeilen) erhalten, die zu toyota_suv aber kein anderes Fahrzeug beziehen. Ich bekomme eine Teilmenge für einen Begriff (toyota_suv) mit dmat<-as.matrix(dtm[1:ncorpus, intersect(colnames(dtm), "toyota_suv")]), die gut funktioniert. Wie richte ich eine Abfrage ein: Dokumente, in denen toyota_suv nicht null ist, aber Werte von nicht-toyota_suv-Spalten null sind? Ich hätte spaltenweise ==0 spezifizieren können, aber diese Matrix wird dynamisch erzeugt. In einigen Märkten gibt es vielleicht vier Autos, in einigen Märkten können es zehn sein. Ich kann colnames vorher nicht angeben. Wie kombiniere ich (dynamisch) alle Nicht-toyota_suv Spalten auf Null, wie all_others == 0? Jede Hilfe wird sehr geschätzt.

Antwort

1

Sie können dies erreichen, indem die Indexposition für toyota_suv bekommen, und dann dtm subsetting, dass für Nicht-Null entsprechen, und alle anderen Spalten unter Verwendung einer negativen Indizierung auf dem gleichen Indexvariable Stellen Sie sicher, dass sie alle null sind.

Hier modifizierte ich Ihre dtm leicht an, so dass die beiden Fälle, in denen toyota_sub nicht Null sind die Kriterien erfüllen, die Sie suchen (da keiner in Ihrem Beispiel, sie erfüllt):

dtm <- read.table(textConnection(" 
toyota_suv gmotors_suv ford_suv nissan_suv 
     0  1  0   0 
     0  1  0   0 
     0  1  0   0 
     0  2  0   0 
     0  4  0   0 
     1  0  0   0 
     1  0  0   0 
     0  1  0   0 
     0  1  0   0 
     0  1  0   0"), header = TRUE) 

Dann funktioniert es:

# get the index of the toyota_suv column 
index_toyota_suv <- which(colnames(dtm) == "toyota_suv") 

# select only cases where toyota_suv is non-zero and others are zero 
dtm[dtm[, "toyota_suv"] > 0 & !rowSums(dtm[, -index_toyota_suv]), ] 
## toyota_suv gmotors_suv ford_suv nissan_suv 
## 6   1   0  0   0 
## 7   1   0  0   0 

Hinweis: Dies ist nicht wirklich eine Frage der Textanalyse überhaupt, sondern ein für wie Matrixobjekte der Teilmenge.

+0

Dank @Ken Benoit: Ich war fast da. – Pradeep

+0

Bearbeitungszeit. Ich habe ein weiteres Objekt von Nicht-toyota_suv-Spalten erstellt: 'x.df3 <-x.df [, Namen (x.df)! =" Toyota_suv ", drop = FALSE]' Und dann die Alles-Null-Bedingung für dieses Objekt ausführen . Aber ich vermisste diese Teilmenge mit der ersten Bedingung 'toyota_suv! = 0' zu integrieren. Ich gehe davon aus, dass es keine Möglichkeit gibt, einen Zwischenschritt zu vermeiden. Auch zu viele negative Kommentare bei der Verwendung einer Teilmengenfunktion oder beim Ausführen mit 'which' oder' with'. also war ich mir nicht sicher. – Pradeep

0

Es wäre hilfreich, wenn Sie den genauen Code, den Sie ausführen, und einen Beispieldatensatz zur Verfügung stellen, damit wir Ihre Arbeit replizieren und ein funktionierendes Beispiel bereitstellen können.

Gegeben, wenn ich Ihre Frage richtig verstehe, suchen Sie nach einer Möglichkeit, alle Nicht-Toyota-Spalten mit Null zu beschriften. Sie könnten versuchen:

df[colnames(df) != "toyota"] <- 0