提问人:Sam 提问时间:3/8/2020 更新时间:3/8/2020 访问量:1395
使用 dplyr mutate() 和 if_else() 的另一个长度错误
Another length error using dplyr mutate() and if_else()
问:
我还有另一个问题,与上一个问题类似。由于它不完全相同,我已将其作为新问题发布。
我正在尝试将向量作为新列添加到 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 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
我错过了什么?再次感谢,如果这是一个菜鸟问题,我很抱歉,但我仍在努力掌握整洁的宇宙!
答:
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 个元素,那么它可以回收length
replace
if_else/ifelse/case_when
在 中,我们将 'data.frame' 转换为 'data.table',在 中指定逻辑条件 (),并在 中 assig () 'add' 向量以创建列 'new_var'。默认情况下,不匹配的元素将填充data.table
certainty == "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
评论