[英]Using dplyr functions within a function, problems with NSE/SE
我正在使用dplyr軟件包在R中工作,並且我需要一個用於重復實例的函數,在該實例中,我將觀察值沿X變量進行分箱,然后將均值繪制在每個這些分箱中的Y變量上。
這是(A)我在此功能上的失敗嘗試的可復制示例,然后是(B)具有單個X和Y的所需輸出的有效示例。
library(plyr)
library(dplyr)
library(ggplot2)
df = data.frame(x = c(1, 2, 3, 4, 5, 6, 7, 8, 9),
y = c(1, 1, 1, 2, 2, 2, 0, 0, 0))
# (A) function that doesn't work correctly
bin_and_plot <- function(data, x, y) {
data.binned = data %>%
mutate_(cut = cut(x, breaks = 3)) %>%
group_by_(cut) %>%
summarise_(n = ~n(),
mean = ~mean(y))
qplot(data = data.binned, x = cut, y = mean)
}
bin_and_plot(df, ~x, ~y)
# (B) working example of desired output
df.binned = df %>%
mutate(cut = cut(x, breaks = 3)) %>%
group_by(cut) %>%
summarise(n = n(),
mean = mean(y))
qplot(data = df.binned, x = cut, y = mean)
我已經閱讀了許多其他類似問題的問題,並在NSE / SE上查看了這些參考資料...
https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html
http://adv-r.had.co.nz/Computing-on-the-language.html
...但是盡管很明顯我遇到評估問題,但仍無法解決。 當前,它在cut()
上是中斷的-我可以避免此錯誤,但是除此問題外,還有多層問題。 我無法成功進行故障排除,可能是因為現在有一些並發的問題。
任何幫助深表感謝。
我將其與以下代碼一起使用。 看來您需要刪除公式中的~
符號和下划線。
通過在定義函數時添加x = as.character()
,可以定義要使用的列的名稱
df = data.frame(x = c(1, 2, 3, 4, 5, 6, 7, 8, 9),
y = c(1, 1, 1, 2, 2, 2, 0, 0, 0))
# create a new column to test the function
df$test = rnorm(9,5,2)
# (A) function that doesn't work correctly
bin_and_plot <- function(data, x = as.character(), y = as.character()) {
data$x = data[,x]
data$y = data[,y]
data.binned = data %>%
mutate(cut = cut(x, breaks = 3)) %>%
group_by(cut) %>%
summarise(n = n(),
mean = mean(y))
qplot(data = data.binned, x = cut, y = mean)
}
bin_and_plot(df,"x","y")
bin_and_plot(df,"test","y")
這是我經常開始使用interp
從包lazyeval。 我認為您鏈接到的小插圖中有一些示例。 同樣,在此特定示例中,不需要group_by_
。
library(lazyeval)
bin_and_plot <- function(data, x, y) {
data.binned = data %>%
mutate_(cut = interp(~cut(var, breaks = 3), var = as.name(x))) %>%
group_by(cut) %>%
summarise_(n = ~n(),
mean = interp(~mean(var2), var2 = as.name(y)))
qplot(data = data.binned, x = cut, y = mean)
}
bin_and_plot(df, "x", "y")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.