2015-05-14 5 views
5

ich einen Datenrahmen, die ich bekam vonR: aufrollen durch Summe Spaltenwerte enthält, NA, während sie von IDs Gruppierung

ID <- c("A","A","A","A","B","B","B","B") 
Type <- c(45,45,46,46,45,45,46,46) 
Point_A <- c(10,NA,30,40,NA,80,NA,100) 
Point_B <- c(NA,32,43,NA,65,11,NA,53) 
df <- data.frame(ID,Type,Point_A,Point_B) 

    ID Type Point_A Point_B 
1 A 45  10 NA 
2 A 45  NA 32 
3 A 46  30 43 
4 A 46  40 NA 
5 B 45  NA 65 
6 B 45  80 11 
7 B 46  NA NA 
8 B 46  100 53 

Während ich von diesen post lernte, kann ich die Daten mit ID aufrollen und einem Säule.

Ich verwende derzeit sqldf, um die Zeilen und Gruppen nach ID und Typ zu summieren. Während dies die Arbeit für mich erledigt, ist es sehr langsam auf einem größeren Datensatz.

df1 <- sqldf("SELECT ID, Type, Sum(Point_A) as Point_A, Sum(Point_A) as Point_A 
        FROM df 
        GROUP BY ID, Type") 

Bitte schlagen Sie die Verwendung von anderen Techniken vor, die dieses Problem lösen könnten. Ich habe begonnen, dplyr & plyr Pakete zu lernen, und ich finde es sehr interessant, aber nicht wissen, wie man es hier anwendet.

gewünschte Ausgabe

ID Type Point_A Point_B 
1 A 45  10 32 
2 A 46  70 43 
3 B 45  80 76 
4 B 46  100 53 

Antwort

4

Mit dplyr:

df %>% group_by(ID, Type) %>% summarise_each(funs(sum(., na.rm = T))) 

Oder

df %>% 
    group_by(ID, Type) %>% 
    summarise(Point_A = sum(Point_A, na.rm = T), 
      Point_B = sum(Point_B, na.rm = T)) 

Oder

f <- function(x) sum(x, na.rm = T) 

df %>% 
    group_by(ID, Type) %>% 
    summarise(Point_A = f(Point_A), 
      Point_B = f(Point_B)) 

Welche gibt:

#Source: local data frame [4 x 4] 
#Groups: ID 
# 
# ID Type Point_A Point_B 
#1 A 45  10  32 
#2 A 46  70  43 
#3 B 45  80  76 
#4 B 46  100  53 
+0

Steven, nochmals vielen Dank, dass du mir auch bei dieser Frage geholfen hast. Dieses dplyr-Paket erstaunt mich jedes Mal. :-) Es ist super schnell auf einem größeren Datensatz. – Sharath

+1

Warum nicht 'summary_each()' ?? – Arun

+0

@Arun Ich habe ähnliche Fragen mit kleinen Varianten beantwortet und vergessen, die einfachste Methode hinzuzufügen. –

9
library(data.table) 

DT <- as.data.table(df) 
DT[, lapply(.SD, sum, na.rm=TRUE), by=list(ID, Type)] 

    ID Type Point_A Point_B 
1: A 45  10  32 
2: A 46  70  43 
3: B 45  80  76 
4: B 46  100  53 
+0

Ricardo, Es funktioniert wie Charme :) aber ich ziehe die Verwendung von dplyr über data.table da ich zur Zeit, dass das Lernen bin. – Sharath

Verwandte Themen