Другая ошибка длины при использовании dplyr mutate () и if_else () - PullRequest
3 голосов
/ 08 марта 2020

У меня есть другая проблема, аналогичная предыдущему вопросу здесь . Поскольку это не совсем то же самое, я разместил его как новый вопрос.

Я пытаюсь добавить вектор в качестве нового столбца в таблицу, но мой вектор короче, чем количество строк, поэтому я Я использую if_else(), чтобы указать условие. Вот пример и моя попытка решения:

library(dplyr)
library(magrittr)

data <- data.frame(
  ID = c("a100", "b100", "c100", "d100", "e100", "f100"),
  certainty = c("confirmed", "likely", "unsure", "likely", "unsure", "confirmed")
)

data %<>% as_tibble()

add <- c(1, 2)

data %<>%
  mutate(new_var =
           if_else(certainty == "likely", add, NA_real_))

В настоящее время это дает мне ошибку Error: true must be length 6 (length of condition) or one, not 2, но, насколько я понимаю, мое состояние имеет длину 2, поскольку sum(data$certainty == "likely") возвращает [1] 2.

Результат должен выглядеть следующим образом:

  ID    certainty new_var
  <fct> <fct>       <dbl>
1 a100  confirmed      NA
2 b100  likely          1
3 c100  unsure         NA
4 d100  likely          2
5 e100  unsure         NA
6 f100  confirmed      NA

Чего мне не хватает? Еще раз спасибо и извините, если это нубский вопрос, но я все еще пытаюсь разобраться с тидиверсом!

Ответы [ 2 ]

3 голосов
/ 08 марта 2020

Здесь есть опция с replace

library(dplyr)
data %>%
   mutate(new_var = replace(rep(NA_real_, n()), certainty == "likely", add))
# A tibble: 6 x 3
#  ID    certainty new_var
#  <fct> <fct>       <dbl>
#1 a100  confirmed      NA
#2 b100  likely          1
#3 c100  unsure         NA
#4 d100  likely          2
#5 e100  unsure         NA
#6 f100  confirmed      NA

Здесь, как известно, length в 'add' равно количеству 'вероятных' элементов в 'уверенности' и replace может сделать замену на основе этой информации. В случае if_else/ifelse/case_when аргументы должны иметь ту же длину, что и вектор условия. Здесь «add» имеет два элемента, и это не 1 или количество строк. Если это 1 элемент, то он может перерабатывать


В data.table мы конвертируем data.frame в data.table, определяем логическое условие (certainty == "likely") в i и ассиг (:=) вектор 'add' для создания столбца 'new_var'. По умолчанию несоответствующие элементы будут заполнены NA

library(data.table)
setDT(data)[certainty == "likely",  new_var := add]
2 голосов
/ 08 марта 2020

Это одна из тех ситуаций, когда использование базы R будет лучше, чем tidyverse или трубы.

data$new_var <- NA
data$new_var[data$certainty == 'likely'] <- add
data

#    ID certainty new_var
#1 a100 confirmed      NA
#2 b100    likely       1
#3 c100    unsure      NA
#4 d100    likely       2
#5 e100    unsure      NA
#6 f100 confirmed      NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...