使用 dplyr mutate() 和 if_else() 的另一个长度错误

Another length error using dplyr mutate() and if_else()

提问人:Sam 提问时间:3/8/2020 更新时间:3/8/2020 访问量:1395

问:

还有另一个问题,与上一个问题类似。由于它不完全相同,我已将其作为新问题发布。

我正在尝试将向量作为新列添加到 tbl,但我的向量比行数短,因此我用于指定条件。这是一个 reprex 和我尝试的解决方案: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_))

这目前给了我错误,但据我所知,我的条件是长度为 2,因为返回。Error: true must be length 6 (length of condition) or one, not 2sum(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

我错过了什么?再次感谢,如果这是一个菜鸟问题,我很抱歉,但我仍在努力掌握整洁的宇宙!

R DPLYR的

评论


答:

3赞 akrun 3/8/2020 #1

这是一个选项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

在这里,“添加”与“确定性”中“可能”元素的数量相同,并且可以根据该信息进行替换。在 的情况下,参数的长度应与条件向量相同。在这里,“add”有两个元素,它不是 1 或行数。如果是 1 个元素,那么它可以回收lengthreplaceif_else/ifelse/case_when


在 中,我们将 'data.frame' 转换为 'data.table',在 中指定逻辑条件 (),并在 中 assig () 'add' 向量以创建列 'new_var'。默认情况下,不匹配的元素将填充data.tablecertainty == "likely"i:=NA

library(data.table)
setDT(data)[certainty == "likely",  new_var := add]
2赞 Ronak Shah 3/8/2020 #2

这是使用基本 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