R - 数据框中的新列,具有基于三个条件的聚合值

时间:2017-06-20 13:49:09

标签: r

假设我有数据框:

df <- data.frame(Year = rep(1:3, each = 5)
                 , Terminal = c(1,1,1,1,1,1,2,2,2,2,2,2,2,1,2)
                 , day = c (1,1,1,1,1,1,2,2,2,2,2,2,2,1,2)
                 , Capacity = sample(1:15))

并尝试获得一个列“X”,它是同一年,一天和终端的容量之和。

原创df

enter image description here

结果:

enter image description here

我使用以下代码进行计算:

aggregate(Capacity ~ Terminal + Year + day , data=df, FUN=sum)

as.data.table(df)[, sum(Capacity), by = .(Terminal, Year, day)]

但是当我尝试创建新列时,它只打印1或2值而不是总和。它还给出了以下的交战。我对X的代码是df["X"] <- aggregate(Capacity ~ Terminal + Year + day , data=df, FUN=sum)

警告讯息: 在[<-.data.frame*tmp*,“X”中,值=列表(终端= c(1,1,:   提供了4个变量来替换1个变量

1 个答案:

答案 0 :(得分:2)

aggregate返回汇总输出,而不是创建新列。我们可以使用mutate

中的dplyr
library(dplyr)
df %>%
   group_by(Year, day, Terminal) %>%
   mutate(X = sum(Capacity))

对于data.table方法,我们需要指定:=来创建新列

as.data.table(df)[, X := sum(Capacity), by = .(Terminal, Year, day)]

ave

中的base R
df$X <- with(df, ave(Capacity, Year, day, Terminal, FUN = sum))