我在R中使用了聚合函数来将我的数据条目从 90k降低到1800 。
a=test$ID
b=test$Date
c=test$Value
d=test$Value1
sumA=aggregate(c, by=list(Date=b,Id=a), FUN=sum)
sumB=aggregate(d, by=list(Date=b,Id=a), FUN=sum)
final[1]=sumA[1],final[2]=sumA[2]
final[3]=sumA[3]/sumB[3]
现在我有一个月内20个不同日期的数据,每天接近 90个不同的ID ,所以它在最终表格中的 1800个条目。
我的问题是,我希望进一步向下聚合并找到每个日期的最终值[3]的最大值,以便我只留下20个值。
简单来说 - 有20天。 每天有90个值,90个ID 我希望每天最多找到这90个值。 所以最后我会留下20天的20个值。
现在聚合功能在这里不起作用' max' 而不是和
Date ID Value Value1
1 A 20 10
1 A 25 5
1 B 50 5
1 B 50 5
1 C 25 25
1 C 35 5
2 A 30 10
2 A 25 45
2 B 40 10
2 B 40 30
这是数据
现在通过使用Aggregate函数,我得到了最终表格
Date ID x
1 A 45/15=3
1 B 100/10=10
1 c 60/30=2
2 A 55/55=1
2 B 80/40=2
现在我想要日期1和2的最大值
Date max- Value
1 10
2 2
答案 0 :(得分:2)
这是使用数据表的一步过程。 data.table是data.frame的进化版本,效果非常好。它有data.frame类,所以就像data.frame一样。
Step0:将data.frame转换为data.table:
library(data.table)
setDT(test)
setkey(test,Date,ID)
步骤1:进行计算
test[,sum(Value)/sum(Value1),by=key(test)][,max(V1),by=Date]
这里是对步骤的解释: 第一部分创建了您在问题中称为最终表格的内容:
test[,sum(Value)/sum(Value1),by=key(test)]
# Date ID V1
# 1: 1 A 3
# 2: 1 B 10
# 3: 1 C 2
# 4: 2 A 1
# 5: 2 B 2
现在将其传递给第二项以按日期执行max函数:
test[,sum(Value)/sum(Value1),by=key(test)][,max(V1),by=Date]
# Date V1
# 1: 1 10
# 2: 2 2
希望这会有所帮助。 这是一个记录很好的包。你应该阅读更多相关信息。
答案 1 :(得分:0)
可能会有所帮助。
test <- structure(list(Date = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L
), ID = c("A", "A", "B", "B", "C", "C", "A", "A", "B", "B"),
Value = c(20L, 25L, 50L, 50L, 25L, 35L, 30L, 25L, 40L, 40L
), Value1 = c(10L, 5L, 5L, 5L, 25L, 5L, 10L, 45L, 10L, 30L
)), .Names = c("Date", "ID", "Value", "Value1"), class = "data.frame", row.names = c(NA,
-10L))
res1 <- aggregate(. ~ID+Date, data=test, FUN=sum)
res1 <- transform(res1, x=Value/Value1)
res1
# ID Date Value Value1 x
#1 A 1 45 15 3
#2 B 1 100 10 10
#3 C 1 60 30 2
#4 A 2 55 55 1
#5 B 2 80 40 2
aggregate(. ~Date, data=res1[,-c(1,3:4)], FUN=max)
# Date x
# 1 1 10
# 2 2 2
aggregate
和ID
运行Date) on the two value column by using
。〜`x
Value/Value1
,即transform
aggregate
最后一次使用一个分组变量(Date
)并删除了除x
以外的其他变量。