2017-09-11 30 views
1

我正在嘗試使用dplyr計算data.frame中包含的變量的移動中位數。我遇到的問題是,我傳入rollapply()的函數與原始data.frame中的變量具有相同的名稱。例如:dplyr中的變量名衝突

df <- data.frame(median = seq(1:100)) 

df %>% 
    mutate(ln_median = log(median)) %>% 
    mutate(ln_median_10 = rollapply(ln_median, 5, median)) 

生成錯誤消息:

Error in eval(substitute(expr), envir, enclos) : '1:100' is not a function, character or symbol

根本原因是,在rollapply()中值解析爲在data.frame變量,而不是功能「中值」。我已經能夠解決這個問題用下面的代碼:

df %>% mutate(ln_median = log(median)) %>% 
     mutate(ln_median_10 = rollapply(ln_median, 5, function(a) median(a), fill = NA)) 

也就是說,是爲了被解釋爲data.frame中的變量壓制它包裹位機能。

是否有一個更優雅的方式來實現相同的事情?

+4

我複製了你的代碼並得到了一個不同的錯誤:「列'ln_median_10'必須是長度100(行數)或者一個,而不是96」。我通過將'fill = NA'參數添加到'rollapply'來修復 – lebelinoz

+0

哪個包是'rollapply'的?它是'動物園'嗎? – useR

回答

0

作爲@lebelinoz在評論中提到,您可以使用fill = NA來解決不等長誤差。雖然不能重現你的錯誤。另請注意,mutate允許您在同一個函數中使用剛剛創建的變量。因此,沒有必要對第二mutate

library(zoo) 

df %>% 
    mutate(ln_median = log(median), 
     ln_median_10 = rollapply(ln_median, 5, median, fill = NA)) 
0

如果這是真的這個問題(但我不能重現它要麼),您可以使用match.fun("median")代替median

1

你試圖傳遞函數名稱爲

stats::median