我一直在努力解決這個問題,它與a question raised here before非常相似。不知何故,我無法將這個問題給出的解決方案轉化爲我自己的問題。在另一個函數中使用dplyr函數
我剛開始時製作的示例數據幀:
test.df <- data.frame(col1 = rep(c('a','b'), each=5), col2 = runif(10))
str(test.df)
下面的函數應該創建基於「組變量」的基團的「statvar」的平均新的數據幀。
test.f <- function(df, groupvar, statvar) {
df %>%
group_by_(groupvar) %>%
select_(statvar) %>%
summarise_(
avg = ~mean(statvar, na.rm = TRUE)
)
}
test.f(df = test.df,
groupvar = "col1",
statvar = "col2")
我想什麼這個返回是用2個計算的平均值(一個用於在COL1所有一個值,一個用於在COL1所有的b值)的數據幀。相反,我得到這個:
col1 avg
1 a NA
2 b NA
Warning messages:
1: In mean.default("col2", na.rm = TRUE) :
argument is not numeric or logical: returning NA
2: In mean.default("col2", na.rm = TRUE) :
argument is not numeric or logical: returning NA
我發現這種奇怪的,因爲我敢肯定COL2是數字:
str(test.df)
'data.frame': 10 obs. of 2 variables:
$ col1: Factor w/ 2 levels "a","b": 1 1 1 1 1 2 2 2 2 2
$ col2: num 0.4269 0.1928 0.7766 0.0865 0.1798 ...
這很好,非常感謝。所以interp()基本上說「R,你應該看到這是一個變量,而不是一個字符串」?然而,我仍然有點困惑,爲什麼avg通過管道符號%>%連接到interp()。 – 1053Inator
@ 1053Inator,你可以把它寫成'avg = interp(〜mean(statvar,na.rm = TRUE),statvar = as.name(statvar))''不用管道系統 –
interp採用expresion'〜mean(statvar,na .rm = TRUE)',並且每次看到statvar字時都會替換as.name(statvar)的結果,即col2。所以表達式被轉換爲「〜mean(col2,na.rm = TRUE)' – bramtayl