【问题标题】:Sorting and aggregating in RR中的排序和聚合
【发布时间】:2014-08-10 01:39:26
【问题描述】:

我使用 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 个条目强> .

我的问题是我想进一步向下聚合并找到每个日期的 final[3] 的最大值,这样我就只剩下 20 个值了。

简单来说—— 有20天。 每天有 90 个值对应 90 个 id 我想为每一天找到这 90 个值中的最大值。 所以最后我会在 20 天内只剩下 20 个值。

现在聚合函数在这里不能使用函数 'max' 而不是 sum

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  

这是数据

现在通过使用聚合函数,我得到了最终表格

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

【问题讨论】:

  • 如果你提供一个小例子来检查问题会更好。
  • 刚刚使用您的数据集更新了解决方案。请检查。
  • 你能告诉我应该如何在聚合函数中使用 Dput 吗?我通过 dput 读取了文件,但它抛出了一个错误。 terms.formula(formula, data = data) 中的错误:'data' 参数类型错误
  • 您可以dput 结果。例如dput(res1)。您可以使用read.tableread.csv 读取文件。一旦你阅读了文件。例如dat <- read.table("file.txt",sep="", header=T) 你可以dput(head(dat)) 看看命令是否有效。
  • res1

标签: r


【解决方案1】:

这是使用数据表的一步过程。 data.table 是 data.frame 的演进版本,效果非常好。它有data.frame的类,所以和data.frame一样工作。

Step0:将data.frame转换为data.table:

library(data.table)
setDT(test)
setkey(test,Date,ID)

Step1:进行计算

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

希望这会有所帮助。 这是一个非常有据可查的软件包。您应该阅读更多相关信息。

【讨论】:

  • 在将数据框转换为数据表时,我看到您手动输入了我无法输入的 ID,因为我从中导入数据的文件有很多 IDS。有什么解决方案,比如使用独特的功能并输入所有的值?
  • 您不必输入所有 ID。只有那些你想分组的。
  • 但是每个文件的ID数在100左右,而且还在不断变化,那么有什么通用的方法来调整它吗?谢谢大佬这么快回复。
  • 我认为有多少个 ID 并不重要。上面的代码你试过了吗?
  • 请注意:您不需要setkey 进行聚合。 ad-hoc by 更快,并保留输入顺序。如果需要,可以在聚合后设置键或排序,因为数据会更小。
【解决方案2】:

这可能会有所帮助。

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
  • 首先我基于两个分组变量(IDDate) on the two value column by using 运行 aggregate。~`
  • 创建了一个新变量xValue/Value1transform
  • 使用一个分组变量 (Date) 最后运行了 aggregate,并删除了除 x 之外的其余变量。

【讨论】:

  • 在将数据框转换为数据表时,我看到您手动输入了我无法输入的 ID,因为我从中导入数据的文件有很多 IDS。有什么解决方案吗,比如使用独特的功能并输入所有的值?
  • @user3504466。我没有在提供的代码中将 data.frame 转换为 data.table。
  • 但是每个文件的ID数在100左右,而且还在不断变化,那么有什么通用的方法来调整它吗?谢谢大佬这么快回复。
  • @user3504466。对不起,我没看懂你的问题。适应什么?
  • 对不起,但我的意思是当我有这么多不断变化的 id 时,我应该如何手动制作结构。 A,b,c 只是向您展示,大约有 100 个,可能更多
猜你喜欢
  • 2021-02-04
  • 1970-01-01
  • 2021-05-19
  • 2021-02-11
  • 2021-02-11
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
相关资源
最近更新 更多