2016-08-02 12 views
1

Ich habe einen Datenrahmen, der wie folgt aussieht:Wiederholungszeilendaten mit kategorialen Variablen eine unterschiedliche Anzahl von Zeiten

DATE SURVEY SPECIES COUNT 
07/12/16 13 Paka 1 
07/12/16 14 Paka 1 
07/12/16 15 Grouper 2 
07/12/16 16 Grouper 3 
07/12/16 18 Grouper 1 
07/12/16 20 Lehi 3 

Wo ‚Count‘ ist die Zahl der Personen, für jede gegebene Umfrage beobachtet. Ich möchte die Daten neu zu gestalten, so dass es eine einzelne Zeile (Datensatz) für jeden einzelnen ist: z.B .:

DATE SURVEY SPECIES 
07/12/16 13 Paka 
07/12/16 14 Paka 
07/12/16 15 Grouper 
07/12/16 15 Grouper 
07/12/16 16 Grouper 
07/12/16 16 Grouper 
07/12/16 16 Grouper 
07/12/16 18 Grouper 
07/12/16 20 Lehi 
07/12/16 20 Lehi 
07/12/16 20 Lehi 

Mit den Daten für jede Umfrage so oft wiederholt wie nötig. Ich betrachtete die Schmelze() oder zusammenfassen() Funktionen aber stecken bin, weil die Zählvariable irgendwo im Bereich von 1 - 10.

Dank

Antwort

1

Sie ursprünglichen Datenrahmen dat ist Angenommen, können Sie Folgendes tun bekommen gewünschte Datenrahmen new_dat:

new_dat <- dat[rep.int(1:nrow(dat), dat$COUNT), -4] 
rownames(new_dat) <- 1:nrow(new_dat) 

der Schlüssel ist, der Zeilenvektor Indexierungs rep.int(1:nrow(dat), dat$COUNT), während die nur die -4 4.en Spaltensignale fallen, dh Spalte COUNT.


-Test

x <- "DATE SURVEY SPECIES COUNT 
     07/12/16 13 Paka 1 
     07/12/16 14 Paka 1 
     07/12/16 15 Grouper 2 
     07/12/16 16 Grouper 3 
     07/12/16 18 Grouper 1 
     07/12/16 20 Lehi 3" 

dat <- read.table(text = x, header = TRUE) 

#DATE SURVEY SPECIES COUNT 
#07/12/16 13 Paka 1 
#07/12/16 14 Paka 1 
#07/12/16 15 Grouper 2 
#07/12/16 16 Grouper 3 
#07/12/16 18 Grouper 1 
#07/12/16 20 Lehi 3 

new_dat <- dat[rep.int(1:nrow(dat), dat$COUNT), -4] 
rownames(new_dat) <- 1:nrow(new_dat) 

#  DATE SURVEY SPECIES 
#1 07/12/16  13 Paka 
#2 07/12/16  14 Paka 
#3 07/12/16  15 Grouper 
#4 07/12/16  15 Grouper 
#5 07/12/16  16 Grouper 
#6 07/12/16  16 Grouper 
#7 07/12/16  16 Grouper 
#8 07/12/16  18 Grouper 
#9 07/12/16  20 Lehi 
#10 07/12/16  20 Lehi 
#11 07/12/16  20 Lehi 
+0

wie ein Charme! Danke :) – makai

1

Hier ist eine weitere Option mit expandRows

library(splitstackshape) 
`row.names<-`(expandRows(df1, "COUNT"), NULL) 
#  DATE SURVEY SPECIES 
#1 07/12/16  13 Paka 
#2 07/12/16  14 Paka 
#3 07/12/16  15 Grouper 
#4 07/12/16  15 Grouper 
#5 07/12/16  16 Grouper 
#6 07/12/16  16 Grouper 
#7 07/12/16  16 Grouper 
#8 07/12/16  18 Grouper 
#9 07/12/16  20 Lehi 
#10 07/12/16  20 Lehi 
#11 07/12/16  20 Lehi 
+0

@ZheyuanLi Die Aufgabe ist es, eine Zeile zu machen, aber im Grunde ist die 'expandRows' nur ein Wrapper, der das selbe tut wie in deinem Code. Allerdings veröffentlichen die Leute Wrapper als eine einzigartige Lösung und bekommen mehr Punkte. Beispiel in Punkt ist [hier] (http://stackoverflow.com/questions/38711057/extracting-a-number-of-a-string-of-varying-lengths/38711116#38711116) – akrun