Использование%>% и ifelse () внутри функции - PullRequest
3 голосов
/ 02 апреля 2020

Я хотел бы запустить функцию, чтобы проверить, существует ли значение в наборе данных или нет. Я искал ответы и с тех пор нашел обходной путь, но он не такой аккуратный, и мне любопытно, почему моя первоначальная попытка не удалась.

Вот упрощенный набор данных

df <- structure(list(country = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("IRE","USA"), 
class = "factor"), year = structure(c(1L, 2L, 3L, 1L, 2L, 3L), .Label = c("1990", "1995", "2000"),
class = "factor")), class = "data.frame", row.names = c(NA, -6L))

> df
  country year
1     IRE 1990
2     IRE 1995
3     IRE 2000
4     USA 1990
5     USA 1995
6     USA 2000

Я хотел бы, чтобы мой функция для возврата 1, если присутствуют конкретный код страны и год, или 0 в противном случае. Это рабочий код:

myFunc <- function(x,y){
  p.ans <- df %>% filter(year == y) 
  ifelse(x %in% p.ans$country, 1, 0)
}

> myFunc("USA", 1995)
[1] 1

> myFunc("USA", 1997)
[1] 0

Но почему этот альтернативный код не работает? Есть ли вариант этого, который будет?

myFunc <- function(x,y){
  df %>% filter(year == y) %>% ifelse(x %in% country, 1, 0)
}

> myFunc("USA", 1997)
 Error in ifelse(., x %in% country, 1, 0) : unused argument (0)

Спасибо!

1 Ответ

5 голосов
/ 02 апреля 2020

Но почему этот альтернативный код не работает?

Поскольку x %>% f(y) совпадает с f(x, y). Таким образом, код, который вы написали, равен

ifelse(filter(df, year == y), x %in% country, 1, 0)

… это не то, как работает функция ifelse.

Вместо этого вы можете написать

df %>% filter(year == y) %>% pull(country) %>% {ifelse(x %in% ., 1, 0)}

Здесь Вы должны окружить вызов функции ifelse с помощью {…}, чтобы канал не вставлял правую часть в качестве первого аргумента в вызов функции (мы хотим использовать x %in% . в качестве первого аргумента, а не просто .).

… или, если вы загрузили пакет 'magrittr', вы можете использовать %$% вместо %>% pull(…) %>% {…}:

df %>% filter(year == y) %$% ifelse(x %in% country, 1, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...