dplyr if_else Ошибка: `true` должно быть длиной x (длина` condition`) или единицей, а не 0 в r - PullRequest
0 голосов
/ 01 марта 2020

У меня есть фрейм данных, который выглядит примерно так:

df <- data.frame('Home.Team'=c("Omaha South", "Millard North", "Elkhorn","Elkhorn"),                      
                 'Winner'=c("Omaha South", "Millard North", "Elkhorn","Elkhorn"),
                 'Won By'=c(8,22,4,30),
                 'Away Class'=c("TRUE", "FALSE", "TRUE", "FALSE"))

Я пытаюсь создать новый столбец / переменную, используя условные if_else из dplyr. Это работало для меня в прошлом, но по какой-то причине теперь дает мне ошибку. Ниже приведен код и ошибка:

df$'Pre Score' <- 
        if_else(df$`Away Class`=="FALSE", 
        if_else(df$Home.Team==df$Winner, .8 + (df$`Won By`/100) -1, -1.2 - (df$`Won By`/100) -1), 
        if_else(df$Home.Team==df$Winner, .8 + (df$`Won By`/100), -1.2 - (df$`Won By`/100)))

Ошибка: true должна быть длиной 4 (длина condition) или единицей, а не 0

Я прочитал несколько обсуждений SO ( пример , пример , пример ), связанных с этим, но не смог перевести его в решение для моего проблема. Кажется, это как-то связано с частью кода if if. Очевидно, он думает, что это длина единицы, тогда как я хочу, чтобы она была длиной 4 или работала для всех строк. Попытался заменить if_else на case_when, но там тоже не удалось.

1 Ответ

2 голосов
/ 01 марта 2020

Это должен был быть комментарий, но он оказался слишком запутанным:

Вы пропускаете точки в именах переменных - data.frame автоматически добавляет их при создании df с именами переменных, в которых есть пробелы :

if_else(df$`Away.Class`=="FALSE", #Away.Class instead of `Away Class`
             if_else(df$Home.Team==df$Winner, .8 + (df$`Won.By`/100) -1, -1.2 - (df$`Won.By`/100) -1), # Won.By instead of `Won By`
             if_else(df$Home.Team==df$Winner, .8 + (df$`Won.By`/100), -1.2 - (df$`Won.By`/100))) # ditto
[1] 0.88 0.02 0.84 0.10

Вот почему ваш код приводит к ошибке: при запуске .8 + (df$ Won By /100) -1 результат равен NULL, поскольку столбец не существует - поэтому список TRUE / ЛОЖНЫЕ результаты равны нулю. ifelse необходимо, чтобы этот список был такой же длины, что и ваше условие (а это четыре, в этом случае каждый ИСТИННЫЙ случай получит соответствующие данные), или 1 (в этом случае все ИСТИННЫЕ результаты получат одинаковый вывод).

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