假设我有数据框:
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
结果:
我使用以下代码进行计算:
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个变量
答案 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))