我正在尝试创建(键,值)对的聚合列表:
d <- data.frame(key.1 = c(1,1),
val.1 = c(100,100),
key.2 = c(1,1),
val.2 = c(100,100),
key.3 = c(2,3),
val.3 = c(100,100))
key.1 val.1 key.2 val.2 key.3 val.3
1 100 1 100 2 100
1 100 1 100 3 100
我希望结果是:
key.1 val.1 key.2 val.2
1 200 2 100
1 200 3 100
意味着(1,100)和(1,100)基于公共1聚合,并且它们的值总计为200.第一行的(2,100)和第二行的(3,100)保持原样,因为没有另一对的共同密钥。
与this question不同,在我的方案中,我必须单独汇总数据框的每一行。目前我只是逐行迭代,并使用“aggregate”对每一行进行迭代。有更聪明的方法吗?
答案 0 :(得分:2)
这是一个可以获取您正在寻找的值的解决方案,虽然格式与您在示例输出中指定的格式略有不同:
根据rownames
创建“ID”,因为您希望最后按行汇总...
d$ID <- rownames(d)
使用reshape
temp <- reshape(d, direction = "long", idvar="ID",
varying = setdiff(names(d), "ID"))
temp
# ID time key val
# 1.1 1 1 1 100
# 2.1 2 1 1 100
# 1.2 1 2 1 100
# 2.2 2 2 1 100
# 1.3 1 3 2 100
# 2.3 2 3 3 100
使用aggregate
通过行(ID)和键(键)的组合计算总和。另外,根据原始ID的“组”创建第二个“ID”。
temp1 <- aggregate(val ~ ID + key, temp, sum)
temp1 <- within(temp1, {
ID2 <- ave(ID, ID, FUN = seq_along)
})
temp1
# ID key val ID2
# 1 1 1 200 1
# 2 2 1 200 1
# 3 1 2 100 2
# 4 2 3 100 2
再次使用reshape
返回“广”形式:
reshape(temp1, direction = "wide", idvar="ID", timevar="ID2")
# ID key.1 val.1 key.2 val.2
# 1 1 1 200 2 100
# 2 2 1 200 3 100
答案 1 :(得分:0)
为此,数据首先需要转换为“整洁”格式。每个键和每个val实际上是相同的变量,并且您希望按键和另一个未明确编码的变量列进行聚合。数据应按如下方式排列:
d <- data.frame(key = c(1,1,1,1,2,3),
val = c(100,100,100,100,100,100),
keycol = c(1,1,2,2,3,3))
哪个给出了
key val keycol
# 1 100 1
# 1 100 1
# 1 100 2
# 1 100 2
# 2 100 3
# 3 100 3
现在只需按key
和keycol
汇总即可获得所需的结果。我喜欢dplyr
。
library(dplyr)
d %>% group_by(key, keycol) %>% summarise(sum(val))
这会以正确的形式提供您想要的结果。
key keycol sum(val)
(dbl) (dbl) (dbl)
#1 1 1 200
#2 1 2 200
#3 2 3 100
#4 3 3 100