如何根据多个列值计算总值

时间:2017-09-11 11:18:49

标签: r sum apply

我有一个包含客户名称和区域数据的数据框。

我想计算每个客户的总面积,因为有些区域跨越多个楼层(例如,Client A可能202 Floor 1 248 Floor 2 {1}})。

我想创建一个包含总面积的新列。

我知道如何创建新列:

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

我想在末尾添加一个新列,其中包含每个客户的所有区域值的总和(我的示例显示累计总数,但是它是否累积无关紧要 - 它仅仅是为了给出一个例子)。

1 个答案:

答案 0 :(得分: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)
相关问题