2017-06-20 80 views
0

假设我有数据帧:的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)) 

,并试图获得columnb“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个变量

回答

2

aggregate返回一个总的输出,而不是创建一个新列。我们可以使用mutatedplyr

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)] 

或者与avebase R

df$X <- with(df, ave(Capacity, Year, day, Terminal, FUN = sum)) 
+0

感谢akrun,最后的代码工作,由于某种原因发生变异不会创建列。它打印DF,它确实计算你。任何想法为什么,我尝试了一个简单的例子,它的工作原理:'df < - data.frame(“A”= 1:6, “B”= 7:12) df < - mutate(df,C = A + B )' – Kalenji

+0

@Kalenji您需要将输出分配回原始数据集,即'df <- df %>%group_by(..' – akrun

+1

谢谢,它的工作原理,任何人重新使用它的完整代码。 ,天,终端)%>% 变异(X =总和(容量))' – Kalenji