2016-04-23 8 views
0

Ich habe einen Datensatz, die etwa wie folgt aussieht:eine Teilmenge der Daten auf Basis der Auswahl auf einer anderen Spalte

 Area  Num 
[1,] "Area 1" "99" 
[2,] "Area 3" "85" 
[3,] "Area 1" "60" 
[4,] "Area 2" "90" 
[5,] "Area 1" "40" 
[6,] "Area 3" NA  
[7,] "Area 4" "10" 
... 

Code:

structure(c("Area 1", "Area 3", "Area 1", "Area 2", "Area 1", 
"Area 3", "Area 4", "99", "85", "60", "90", "40", NA, "10"), .Dim = c(7L, 
2L), .Dimnames = list(NULL, c("Area", "Num"))) 

Ich brauche eine Berechnung auf Werte in Num für jeden zu tun Area, zum Beispiel Berechnung der Summe von jedem Area, oder summary von jedem Area.

Ich denke an eine nested for Schleife, um dies zu erreichen, aber ich bin mir nicht sicher, wie.

+2

Zuerst habe ich Ich schlage vor, dass Sie data.frame anstelle von matrix verwenden, wenn Spalten unterschiedliche Typen haben (Ihr Beispiel-Dataset ist eine Matrix, in der die zweite Spalte wahrscheinlich von numerisch in Zeichen umgewandelt wurde Die Matrizen unterstützen nur einen Elementtyp. – digEmAll

+1

Dann benötigen Sie keine Schleife, um diese aggregierten Berechnungen durchzuführen, z. Sie können 'by',' aggregate' oder 'split' Funktion verwenden ... – digEmAll

Antwort

2

Sie können dies mit aggregate tun, aber das dplyr-Paket macht es sehr einfach, mit solchen Problemen zu arbeiten. Es gibt jedoch viele Duplikate dieser Frage.

library(dplyr) 

df <- structure(c("Area 1", "Area 3", "Area 1", "Area 2", "Area 1", 
        "Area 3", "Area 4", "99", "85", "60", "90", "40", NA, "10"), .Dim = c(7L, 
                         2L), .Dimnames = list(NULL, c("Area", "Num"))) 


df <- data.frame(df) 
df$Num <- as.numeric(df$Num) 

df2 <- df %>% 
    group_by(Area) %>% 
    summarise(totalNum = sum(Num, na.rm=T)) 

df2 
+0

Ich denke, Sie sollten Ihre Antwort auf inculde na.rm = True aktualisieren, ansonsten wird Area 3 NA – aelwan

1

tun das Gleiche mit data.table

library(data.table) 

dt <- data.table(df) 

dt[,sum(as.numeric(Num),na.rm=T),by=Area] 
##   Area V1 
## 1: Area 1 199 
## 2: Area 3 85 
## 3: Area 2 90 
## 4: Area 4 10 
2

Um die Funktion zu jeder Ebene des Faktor anzuwenden, können wir auf die by Funktion Rekursion:

dt <- structure(c("Area 1", "Area 3", "Area 1", "Area 2", "Area 1", 
       "Area 3", "Area 4", "99", "85", "60", "90", "40", NA, "10"), .Dim = c(7L, 2L), .Dimnames = list(NULL, c("Area", "Num"))) 


dt <- data.frame(dt) 
dt$Num <- as.numeric(dt$Num) 

t <- by(dt$Num, dt$Area, sum) 
t 
+0

Dies funktioniert, ist aber keine ideale Lösung ; Der eigentliche Datensatz enthält viele verschiedene "Bereiche". Sie einzeln zu benennen ist einfach nicht machbar. – Edwin

+0

Meine Schuld. Ich habe die Frage mit einer angemesseneren Lösung bearbeitet. Ich hoffe es funktioniert richtig. – Worice

+0

Ja, es ist großartig! Ich versuche die verschiedenen Möglichkeiten zu lernen, eine Sache zu machen. – Edwin

Verwandte Themen