首页 > 解决方案 > 使用 dplyr mutate() 和 if_else() 的另一个长度错误

问题描述

我有另一个与前面的问题类似的问题。由于它不完全相同,我将其发布为一个新问题。

我正在尝试将向量作为新列添加到 tbl,但我的向量比行数短,因此我使用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,但据我所知,我的条件是自sum(data$certainty == "likely")返回以来的长度为 2 [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

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

标签: rdplyr

解决方案


这是一个选项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已知“添加”的数量与“确定性”中“可能”元素的数量相同,并且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]

推荐阅读