2017-09-11 73 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)