是否可以使用聚合函数从原始数据框添加另一列,而不实际使用该列来聚合数据?
这是一个非常简洁的数据版本,有助于说明我的问题(让我们称之为数据)
name result.1 result.2 replicate day data.for.mean
"obj.1" 1 "good" 1 1 5
"obj.1" 1 "good" 2 1 7
"obj.1" 1 "great" 1 2 6
"obj.1" 1 "good" 2 2 9
"obj.1" 2 "bad" 1 1 10
"obj.1" 2 "not good" 2 1 6
"obj.1" 2 "bad" 1 2 5
"obj.1" 2 "not good" 2 2 3
"obj.2" 1 "excellent" 1 1 14
"obj.2" 1 "good" 2 1 10
"obj.2" 1 "good" 1 2 11
"obj.2" 1 "not bad" 2 2 7
"obj.2" 2 "bad" 1 1 4
"obj.2" 2 "bad" 2 1 3
"obj.2" 2 "horrible" 1 2 2
"obj.2" 2 "dismal" 2 2 1
你会注意到result.1和result.2是绑定的,这样如果result.1 == 1,result.2是好的/伟大的,如果result.1 == 2,那么result.2 = =糟糕/不好。我需要聚合数据集中的这两列,并且在聚合数据时选择result.2中的哪个值无关紧要,我只需要信息来确定result.1列的1值是好还是坏同样的结果。因此它可能具有与所有result.1的值相对应的所有“dismal”值。
问题在于,由于result.2使用不同的名称来识别好/坏,我不能将它用作聚合的列。
目前我的聚合函数看起来像这样......
aggregated.data <- aggregate(data[c("data.for.mean")],
by=data[c("name", "result.1", "day") ],
FUN= mean }
);
这会产生一行输出,例如......
name result.1 day data.for.mean
"obj.1" 1 1 6
(第1天的obj.1的所有重复项,结果为1 == 1,已经被忽略了。它们的值为5和7,是模拟数据集中的前两行。)< / p>
我想要的是产生一行输出,例如这个
name result.1 result.2 day data.for.mean
"obj.1" 1 "good" 1 6
同样,对于与result.1的值“1”相对应的所有值,“good”可以替换为“great”,“not bad”,“excellent”。
从result.2捕获信息并将其添加到aggregated.data(聚合函数的输出)的最佳方法是什么?
谢谢。
答案 0 :(得分:1)
dplyr
:
require(dplyr)
group_by(data,name,result.1,day) %.% summarise(mean=mean(data.for.mean),result.2=result.2[1])
#Source: local data frame [8 x 5]
#Groups: name, result.1
# name result.1 day mean result.2
#1 obj.2 1 2 9.0 good
#2 obj.2 1 1 12.0 excellent
#3 obj.1 1 1 6.0 good
#4 obj.1 1 2 7.5 great
#5 obj.1 2 2 4.0 bad
#6 obj.1 2 1 8.0 bad
#7 obj.2 2 2 1.5 horrible
#8 obj.2 2 1 3.5 bad
答案 1 :(得分:1)
以下是基础解决方案,使用merge
后跟另一个aggregate
:
agg.2 <- merge(aggregated.data, data[,names(data) != 'data.for.mean'])
aggregate(result.2 ~ name+result.1+day+data.for.mean, data=agg.2, FUN=sample, size=1)
## name result.1 day data.for.mean result.2
## 1 obj.2 2 2 1.5 dismal
## 2 obj.2 2 1 3.5 bad
## 3 obj.1 2 2 4.0 bad
## 4 obj.1 1 1 6.0 good
## 5 obj.1 1 2 7.5 great
## 6 obj.1 2 1 8.0 not good
## 7 obj.2 1 2 9.0 not bad
## 8 obj.2 1 1 12.0 excellent
以下是其工作原理:
合并会添加result.2
值,但会创建多行,其中有多个此类值。然后aggregate
用于选择其中一行。
正如您所说,您不关心您获得哪些相关的result.2
标签,我会随机获得一个sample
。
要返回第一个result.2
标签,请使用head
代替n=1
:
aggregate(result.2 ~ name+result.1+day+data.for.mean, data=agg.2, FUN=head, n=1)
同样,要获取最后一个此类标签,请将tail
与n=1
一起使用。