2017-06-20 78 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