2016-04-23 67 views
0

我有一個數據集看起來是這樣的:基於另一列中選擇數據的子集

 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" 
... 

代碼:

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"))) 

我需要做值的一些計算中Num每個例如計算每個Area或每個Areasummary的總和。

我正在考慮使用nested for循環來實現這一點,但我不知道如何去做。

+2

首先,我建議您在列有不同類型時使用data.frame而不是矩陣(您的示例數據集是矩陣,其中第二列可能已從數字轉換爲字符) e矩陣僅支持一種元素類型) – digEmAll

+1

然後,您不需要循環來執行這些彙總計算,例如,你可以使用'by','aggregate'或'split'功能... – digEmAll

回答

2

您可以使用aggregate來完成此操作,但使用dplyr軟件包可以很容易地處理這些問題。雖然這個問題有很多重複。

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

我認爲你應該更新你的答案inculde na.rm = True,否則區域3將是NA – aelwan

1

否則使用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

爲了功能適用於因子的每個級別同樣的事情,我們可以遞歸到by功能:

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

這種方法可行,但不是理想的解決方案;實際數據集包含許多不同的「區域」。一一命名它們根本不可行。 – Edwin

+0

我的錯。我用更合適的解決方案編輯了這個問題。我希望它能正常工作。 – Worice

+0

是的,它太棒了!我試圖學習用不同的方法來做一件事。 – Edwin

相關問題