2016-06-21 12 views
2

Unten ist ein Teil von etwas ähnlichem wie meine Daten-Set:Zählung Etiketten pro Seite und Übersichtstabelle in R erstellen

require(dplyr) 
alldata 
site date percent_rank Label 
01A 2013-01-01 0.32   Normal 
01B 2013-01-01 0.12   Low 
01C 2013-01-01 0.76   High 
02A 2013-01-01  0   N/A 
02B 2013-01-01 0.16   Low 
02C 2013-01-01 0.5   Normal 
01A 2013-01-02 0.67   Normal 
01B 2013-01-02 0.01   Low 
01C 2013-01-02 0.92   High 

I zugeordnet jeweils ein Etikett PERCENT_RANK basierend auf dem Wert (0 bis 0,25 bis 0,75 zu 1 die drei Kategorien). Ich mag nun eine Übersichtstabelle in diesem Format produzieren:

site Low Normal High Missing 
01A 32 47  92 194 
01B 232 23  17 93 
01C 82 265  12 6 

wo jeder Standort eine Zählung der Vorkommen von niedrig, normal und hohen Werten für alle Termine mit dieser Site Label haben würde (es gibt einen für jeden Tag des Jahres) und N/A-Werte würden für die Spalte "Missing" gezählt werden.

Ich habe das versucht, folgende:

alldata <- %>% group_by(site) %>% mutate(length(Label == "Low")) 

, die den Gesamtwert aller Datensätze zurückgibt, anstatt eine Anzahl von „Low“ pro Standort und

alldata <- %>% group_by(site) %>% mutate(length(which(Label == "Low"))) 

die mehrere einen Wert zurückgibt Tausend höher als die Gesamtzahl der Datensätze. Die Idee war, dass ich diese Funktion wiederholen würde, um vier neue Spalten mit vier separaten Mutationszeilen (eine für jede Kategorie) zu erstellen, und dies würde meine Übersichtstabelle erzeugen. Ich habe auch einige Variationen von Aggregat() versucht, obwohl die Funktionskomponente für mich weniger klar war für das, was ich vorhabe. Das scheint mir ziemlich einfach zu sein (und group_by hat mir bei der Berechnung des prozentualen Ranks und der zugehörigen Labels gut geholfen), aber ich konnte bis jetzt keine Lösung finden. Irgendwelche Tipps werden sehr geschätzt!

+0

Es gibt eine 'count' Funktion im' dplyr' Paket. Vielleicht ist das hilfreich. – user2100721

+0

Wenn Sie 'which' Länge verwenden, ist genug, aber mit logischen Vektor, gibt' sum' die Anzahl. – akrun

Antwort

0

Wir dcast von data.table, verwenden Sie die auch die fun.aggregate haben und sehr schnell ist.

library(data.table) 
dcast(setDT(alldata), site~Label, length) 

Oder dplyr/tidyr

library(dplyr) 
library(tidyr) 
alldata %>% 
    group_by(site, Label) %>% 
    tally() %>% 
    spread(Label, n) 

A base R Option würde

reshape(aggregate(date~site + Label, alldata, length), 
      idvar = "site", timevar="Label", direction="wide") 
+1

Das ist perfekt! Ich bin vertraut mit den 'dplyr' und' tidyr' Paketen, so dass dies gut mit dem Format des restlichen Codes übereinstimmt. Danke @akrun, und allen für die schnellen Antworten. – acersaccharum

1

Es gibt drei Möglichkeiten, dies in dplyr tun werden. Die erste ist die am ausführlichsten und die beiden anderen Verwendung Komfortfunktionen, den Code zu verkürzen:

library(reshape2) 
library(dplyr) 

alldata %>% group_by(site, Label) %>% summarise(n=n()) %>% dcast(site ~ Label) 

alldata %>% group_by(site, Label) %>% tally %>% dcast(site ~ Label) 

alldata %>% count(site, Label) %>% dcast(site ~ Label) 
1

Um nur eine Übersichtstabelle produzieren, könnten Sie table:

with(df, table(site, Label, useNA="ifany"))[, c(2,4,1,3)] 

    Label 
site Low Normal High N/A 
    01A 0  2 0 0 
    01B 2  0 0 0 
    01C 0  0 2 0 
    02A 0  0 0 1 
    02B 1  0 0 0 
    02C 0  1 0 0 

Daten

df <- read.table(header=T, text="site date percent_rank Label 
01A 2013-01-01 0.32   Normal 
01B 2013-01-01 0.12   Low 
01C 2013-01-01 0.76   High 
02A 2013-01-01  0   N/A 
02B 2013-01-01 0.16   Low 
02C 2013-01-01 0.5   Normal 
01A 2013-01-02 0.67   Normal 
01B 2013-01-02 0.01   Low 
01C 2013-01-02 0.92   High")