2017-09-11 101 views
0

我有一個數據框,其中包含客戶端名稱和區域數據。如何根據多列值計算總值

我要計算的總面積爲每個客戶端的一些地區跨越多個樓層(例如,Client A可能對Floor 2202Floor 1248)。

我想創建一個總面積的新列。

我知道如何創建新列:

areas$new_area 

而且我知道如何計算的總面積爲每個客戶端(手動):

sum(areas[areas$client == "Client A", "areas"]) 

什麼我有難度遍歷數據框並自動執行整個過程。

我想出了一個遍歷數據框的部分解決方案,但它僅計算每個客戶端在位置i處的每個區域值的總和(我知道這總是會發生的,因爲它只會使用單個值area列,當然):

for(i in 1:nrow(areas)){ 
    areas$new_area[i] <- sum(areas$areas[i]) 
} 

而且,我懷疑/知道一個apply功能幾乎可以肯定是在這裏採取的辦法,但我不知道該用哪一個也不知道怎樣去應用它(無雙關意圖)。

我該如何a)實現這個和b)實現它在一個更清潔的方式?

我的預期輸出是這樣的(或者它的一些變化):

-------------------------------------- 
| Client | Floor | Area | New Area | 
-------------------------------------- 
| A | 1 | 202 | 202  | 
-------------------------------------- 
| A | 2 | 248 | 450  | 
-------------------------------------- 
| B | 1 | 1000 | 1000 | 
-------------------------------------- 
| B | 2 | 150 | 1150 | 
-------------------------------------- 

我想在與將總面積值的爲每個客戶端的新列(我的例子顯示了一個累積總數,但它是否是累積無關緊要 - 僅僅是爲了舉例)。

+0

@agenis我已經更新了問題計算總量。 – MusTheDataGuy

+1

好吧,在我看來,你需要的只是按組進行總結?如果它的情況下這個答案可以幫助? https://stackoverflow.com/q/1660124/3871924 – agenis

回答

1
summedAreas <- aggregate(Area ~ Client, areas, sum) 
allYourData <- merge(Area, summedAreas, by = "Client") 

我喜歡聚集在tapply,因爲我得到一個不錯的data.frame回來,但你可以用

tapply(X = areas$Area, INDEX = areas$Client, FUN = sum)