我整個銷售數據的數據框計算dplyr::summarize
。 我做一個分組(S,D,Y),然後在每個組中,計算中間值和平均值爲5..43周,然後將它們合併回父df。變量X是銷售額。 X從來就不是NA(即df中沒有顯式的NAs),但是如果沒有S,D,Y和周的數據(如在,沒有銷售),那麼這些值將不會有任何行在df中(這意味着對於特定的一組參數零銷售量)。換句話說,在任何結構上缺少的行推諉X = 0(但我希望我不需要melt/cast
原來的DF,避免膨脹。至cast(fill....,add.missing=T)
或caret::preProcess()
類似)。dplyr成語彙總()已過濾組通過,並更換任何來港由於缺少行
兩個關於我的代碼風格問題:
是它更好地使用總結比
dplyr::filter
,因爲過濾器物理降到行,所以我必須將結果賦予df.tmp
然後左鍵加入它回到原來的df(如下)?此外,在每一行總結計算中重複的大子集表達式會使代碼難以閱讀。 我應該擔心(或不是)緩存子集操作的行或邏輯索引,在我可能計算的一般情況下,說n = 20個新的總結變量?並非所有的S,D,Y組和過濾器(對於那些星期)都有行,所以如何獲得總結以取代任何缺失行上的NA?目前我做如下。
對不起的代碼和數據集都是私有的,但這裏的代碼風格,以下是代碼,你應該首先運行產生抽樣數據:
# Compute median, mean of X across wks 5..43, for that set of S,D,Y-values
# Issue a) filter() or repeatedly use subset() within each calculation?
df.tmp <- df %.% group_by(S,D,Y) %.% filter(Week>=5 & Week<=43) %.%
summarize(ysd_med543_X = median(X),
ysd_mean543_X = mean(X)
) %.% ungroup()
# Issue b) how to replace NAs in groups where the group_by-and-filter gave empty output?
# can you merge this code with the summarize above?
df <- left_join(df, df.tmp, copy=F)
newcols <- match(c('ysd_mean543_X','ysd_med543_X'), names(df))
df[!complete.cases(df[,newcols]), newcols] <- c(0.0,0.0)
並運行此先產生樣本 - 數據:
set.seed(1234)
rep_vector <- function(vv, n) {
unlist(as.vector(lapply(vv, function(...) {rep(...,n)})))
}
n=7
m=3
df = data.frame(S = rep_vector(10:12, n), D = 20:26,
Y = rep_vector(2005:2007, n),
Week = round(52*runif(m*n)),
X = 4e4*runif(m*n) + 1e4)
# Now drop some rows, to model structurally missing rows
I <- sort(sample(1:nrow(df),0.6*nrow(df)))
df = df[I,]
require(dplyr)
「你不會得到更多」。對不起,但是製作一些隨機數據不應該很難。 – Arun
@阿倫:由於以上流行的需求是樣本數據...不是它是嚴格需要的...現在我可以期待一些答案? – smci
我想根源是[dplyr總結:等效「.drop = FALSE」,以保持基團與在輸出零長度(http://stackoverflow.com/questions/22523131/dplyr-summarise-equivalent-of-丟失 - 錯誤保持組與零長度在); https://github.com/hadley/dplyr/issues/341。但今天我需要一個解決方法。 – smci