Превращение dplyr piping в функцию, которая ведет "Ошибка: результат должен иметь длину n, а не N." - PullRequest
1 голос
/ 11 марта 2020

У меня есть датафрейм, и я пытаюсь манипулировать результатами с помощью dplyr для практики. Мой стандартный подход работает, однако всякий раз, когда я пытаюсь запустить его, завернутый в функцию, я получаю Error: Result must have length 1, not 12., я должен получать две распечатки. Вот воспроизводимый пример:

library(tidyverse)
library(dplyr)
dat <- data.frame(Class= c("3rd","First","2nd","3rd","First","2nd","3rd","First","2nd","3rd","First","2nd"),
                  Sex= c("Male","Male","Male","Female","Female","Female","Male","Male","Male","Female","Female","Female"),
                  Age= c("Child","Child","Child","Child","Child","Child","Adult","Adult","Adult","Adult","Adult","Adult"),
                  Survived= c("No","No","Yes","No","Yes","No","Yes","Yes","No","Yes","No","Yes"))

multiple_col_selection2 <- function(data, sex_var, age_var){

  data %>%
    group_by(data[,4],data[,2],data[,3])%>%
    filter(.[[2]]== sex_var & .[[3]]== age_var) %>%
    count() %>%
    ungroup()%>%
    add_row({{Sex}} = "Total",  n= sum(.$n)) -> dataset

    paste0(round(dataset$n[1] * 100/dataset$n[3], 2), "% NOT survived.")
    paste0(round(dataset$n[2] * 100/dataset$n[3], 2), "% survived.")
}

multiple_col_selection2(dat,"Female","Adult") #Error: Result must have length 1, not 12

#Whereas if I do it standalone, it works
ex_dat <- dat %>%
          group_by(Sex, Age, Survived)%>%
          filter(Sex== "Female" & Age== "Adult") %>%
          count()%>%
          ungroup()%>%
          add_row(Sex = "Total",  n= sum(.$n))
paste0(round(ex_dat$n[1] * 100/ex_dat$n[3], 2), "% NOT survived.")
#[1] "33.33% NOT survived."
paste0(round(ex_dat$n[2] * 100/ex_dat$n[3], 2), "% survived.")
#[1] "66.67% survived."

Я читал эти посты здесь: Обтекание фильтра dplyr в функции приводит к «Ошибка: результат должен иметь длину 4803, а не 3»
Создание функции с аргументом, переданным dplyr :: filter, каков наилучший способ обойти nse?
Однако мой подход отличается от подходов в этих ссылках. Я впервые использую dplyr.

1 Ответ

1 голос
/ 11 марта 2020

Спасибо @Gregor Thomas за помощь в устранении ошибок и указаниях.

multiple_col_selection2 <- function(data, sex_var, age_var){

  data %>%
    group_by_at(.vars = c(2, 3,4))%>%
    filter(Sex== sex_var & Age== age_var) %>%
    count() %>%
    ungroup()%>%
    add_row(Sex = "Total",  n= sum(.$n)) -> dataset

    paste0(round(dataset$n[1] * 100/dataset$n[3], 2), "% NOT survived.", "And ", round(dataset$n[2] * 100/dataset$n[3], 2), "% survived.")
}

multiple_col_selection2(dat,"Female","Adult") #Error resolved
#[1] "33.33% NOT survived. And 66.67% survived."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...