如何在不使用循环的情况下在R中解决此问题?

时间:2019-11-27 20:52:40

标签: r dataframe

假设我有一个这样的数据框:

df=data.frame("A"=factor(c(1,2,1,4,2)), "date"=factor(c("1999","2000","1999","2001","2001")), "value"=c(10,20,30,40,50))

如果它们具有相同的“ A”和“日期”,则需要对“值”列中的值求和。 所以我需要的是这样的数据框:

dfnew=data.frame("A"=factor(c(1,2,1,4,2)), "date"=factor(c("1999","2000","1999","2001","2001")), "value"=c(10,20,30,40,50), "sum"=c(40,20,40,40,50))

我可以循环执行此操作,但是由于我的数据集很大,所以速度很慢。有什么方法可以更快地做到这一点?

3 个答案:

答案 0 :(得分:2)

使用dplyr,您可以简单地执行以下操作:

library(dplyr)
df %>% group_by(date,A) %>% mutate(Sum = sum(value))

# A tibble: 5 x 4
# Groups:   date, A [4]
  A     date  value   Sum
  <fct> <fct> <dbl> <dbl>
1 1     1999     10    40
2 2     2000     20    20
3 1     1999     30    40
4 4     2001     40    40
5 2     2001     50    50

答案 1 :(得分:2)

我们可以使用data.table

library(data.table)
setDT(df)[, sum := sum(value), .(date, A)]

或与base R

df$sum <- with(df, ave(value, A, date, FUN = sum))

答案 2 :(得分:2)

基本的R解决方案:

aggregate(value ~ A + date, data=df, sum)
  A date value
1 1 1999    40
2 2 2000    20
3 2 2001    50
4 4 2001    40