2016-05-31 12 views
3

Ich versuche, meine Daten so zu transformieren, dass jedes Schlüsselwort einen Wert hat und nicht nach Wert gruppiert. Meine Daten werden zur Zeit wie folgt organisiert:R transformieren Daten mit mehreren Werten

df:

score1 score2 keyword1 keyword2 keyword3 
.2 .4 brown fox jump 
.7 .2 hello bye  
.1 .9 foo   

Ich würde meine Daten gerne wie folgt aussehen:

keyword score1 score2 
brown .2 .4  
fox .2 .4  
jump .2 .4  
hello .7 .2  
bye .7 .2 
foo .1 .9 

Daten:

df = structure(list(score1 = c(.2, .7, .1), score2 = c(.4, .2, .9), keyword1 = c("brown", "hello", "foo"), keyword2 = c("fox", "bye"), keyword3 = "jump"), .Names = c("score1", "score2", "keyword1", "keyword2", "keyword3"), row.names = c(NA, -5L), class = "data.frame") 

irgendwelche Vorschläge?

Antwort

3

Eine weitere Alternative mit gather() von tidyr:

library(tidyr) 

df %>% 
    gather(label, keyword, -(score1:score2), na.rm = TRUE) 

Welche gibt:

# score1 score2 label keyword 
#1  0.2 0.4 keyword1 brown 
#2  0.7 0.2 keyword1 hello 
#3  0.1 0.9 keyword1  foo 
#6  0.2 0.4 keyword2  fox 
#7  0.7 0.2 keyword2  bye 
#11 0.2 0.4 keyword3 jump 

Optional Sie die label Spalte entfernen konnte durch Zugabe von select(-label) zu Die Kette.


Daten

df <- structure(list(score1 = c(0.2, 0.7, 0.1, NA, NA), score2 = c(0.4, 
0.2, 0.9, NA, NA), keyword1 = c("brown", "hello", "foo", NA, 
NA), keyword2 = c("fox", "bye", NA, NA, NA), keyword3 = c("jump", 
NA, NA, NA, NA)), .Names = c("score1", "score2", "keyword1", 
"keyword2", "keyword3"), row.names = c(NA, -5L), class = "data.frame") 
4

hier eine Methode ist melt vom data.table Paket mit:

# drop some missing obs 
df <- df[1:3, ] 
# create ID variable 
df$id <- 1:nrow(df) 

# load data.table 
library(data.table) 
# reshape long (melt) 
newdf <- melt(df, id.vars=c("id", "score1", "score2"), 
    measure.vars=c("keyword1", "keyword2", "keyword3"), value.name="keyword") 

Obwohl nicht notwendig, in dem Beispiel I ein ID-Variable hinzugefügt, so dass dieses Verfahren wird größere Datenmengen arbeiten, um den Fall abzudecken, wo SCORE1 und Score2 kann für mehrere Beobachtungen identisch sein. Dies erzeugt zwei weitere Spalten als in Ihrem Beispiel, die ID-Spalte und eine Spalte mit "keyword1" und so weiter. Es ist einfach genug, diese fallen zu lassen. Außerdem sind einige Zeilen vorhanden, die NA sind, was mit der nicht-rechteckigen Form der Eingabedaten zu tun hat. Diese können mit is.na fallen gelassen werden:

# drop rows with missing values in keyword column 
newdf <- newdf[!is.na(newdf$keyword),] 
+0

ich Ihre Antwort gefallen hat, habe ich eine Frage. Ich bin seit fast einem Jahr mit R beschäftigt, aber ich sehe keinen Fortschritt. Wie arbeitest du mit R? – nik

+0

Viele Stunden, viele Jahre: Der Fortschritt kann langsam sein. Am wichtigsten: Verbringe zusätzliche Zeit damit, den Arbeitscode auseinander zu nehmen, um zu sehen, was jedes Teil macht. Lesen Sie Hilfedateien von Funktionen, die Sie nicht verstehen. Erfahren Sie mehr über Objekttypen und welche Objekttypen von einer bestimmten Funktion benötigt werden. – lmo

+0

danke ich habe es getan und ich werde es tun, danke nochmal mann – nik

Verwandte Themen