簡體   English   中英

在函數中使用dplyr函數,NSE / SE有問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM