在R中排序和聚合

时间:2014-08-08 16:37:55

标签: r

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

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
  • 首先,我根据两个分组变量(aggregateID运行Date) on the two value column by using。〜`
  • 使用x
  • 创建了一个新变量Value/Value1,即transform
  • aggregate最后一次使用一个分组变量(Date)并删除了除x以外的其他变量。
相关问题