r - 使用 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!
解决方案
这是一个选项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]
推荐阅读
- php - Woocommerce:获取与使用添加到购物车按钮添加到购物车的产品相关的所有信息
- ruby-on-rails - 在 Rails 中出现 db 错误时,有没有办法从 aws 实例中删除数据库?
- python - 带有烧瓶的 Ajax 用于实时更新网页上的传感器数据
- c - while(!feof(f)){...} 解释
- promise - 节点 AWS Lambda 问题:它在超时时工作。当我回调时,最后处理的项目实际上并没有处理
- c++ - 当我尝试使用字符串运行任何代码时退出代码 3221225785
- java - BottomNavigationView 片段上方的奇怪空栏
- .net-core - 使用 dotnet-watch 时设置了哪些 MSBuild 属性?
- django - CreateView 模型对象到模板
- r - Inter-Rater Reliabilty:同时运行多个 Cohen's Kappa(使用 R)