我有一个数据库:
structure(list(id_mujer = c(8528, 8528, 11711, 11711, 11818,
11818), hpv_post = structure(c(1339459200, 1458172800, 1443571200,
1443571200, 1354838400, 1525392000), tzone = "UTC", class = c("POSIXct",
"POSIXt")), hpv_post_res = c("NEG", "NEG", "POS", "POS", "NEG",
"NEG")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))# A tibble: 6 x 3
id_mujer hpv_post hpv_post_res
<dbl> <dttm> <chr>
1 8528 2012-06-12 00:00:00 NEG
2 8528 2016-03-17 00:00:00 NEG
3 11711 2015-09-30 00:00:00 POS
4 11711 2015-09-30 00:00:00 POS
5 11818 2012-12-07 00:00:00 NEG
6 11818 2018-05-04 00:00:00 NEG我需要创建一个名为“hpv_post_res”的列,其中观察的hpv_post是"POS“,如果不是0。问题是当我这么做的时候:
base_contactos_3 %>%
mutate(positivo= if_else(hpv_post_res=="POS", hpv_post, 0))由于某种原因,我得到了这个错误:
Error: Problem with `mutate()` column `positivo`.
i `positivo = if_else(hpv_post_res == "POS", hpv_post, 0)`.
x 'origin' must be supplied
Run `rlang::last_error()` to see where the error occurred.当一个人说,如果条件是假的,放0只是因为我不知道该怎么做,它并不是超越的。但是如果不是0,而是放了一个字符串,比如:
base_contactos_3 %>%
mutate(positivo= if_else(hpv_post_res=="POS", hpv_post, "negative"))它给了我这个错误:
Error: Problem with `mutate()` column `positivo`.
i `positivo = if_else(hpv_post_res == "POS", hpv_post, "negative")`.
x `false` must be a `POSIXct/POSIXt` object, not a character vector.
Run `rlang::last_error()` to see where the error occurred.如果一个put是NA而不是0(这是我更喜欢的选项),它会给出以下错误:
Error: Problem with `mutate()` column `positivo`.
i `positivo = if_else(hpv_post_res == "POS", hpv_post, NA)`.
x `false` must be a `POSIXct/POSIXt` object, not a logical vector.
Run `rlang::last_error()` to see where the error occurred.发布于 2022-03-26 04:40:39
错误告诉您原因:您“想要变异”的列是字符类型"POS“,如果为真,但如果为FALSE,则提供日期。这就是为什么,如果你给一个角色,它的工作。
第一个对我有用的想法:如果你觉得它没有用,请告诉我。
base_contactos_3%>%
mutate(positivo= if_else(hpv_post_res=="POS", as.character(hpv_post), as.character(0)))给出以下结果。由于将日期和字符合并为TRUE/FALSE的选择,因此在结果列中只能有1。(因为时间是0,所以只取日期)
# A tibble: 6 x 4
id_mujer hpv_post hpv_post_res positivo
<dbl> <dttm> <chr> <chr>
1 8528 2012-06-12 00:00:00 NEG 0
2 8528 2016-03-17 00:00:00 NEG 0
3 11711 2015-09-30 00:00:00 POS 2015-09-30
4 11711 2015-09-30 00:00:00 POS 2015-09-30
5 11818 2012-12-07 00:00:00 NEG 0
6 11818 2018-05-04 00:00:00 NEG 0发布于 2022-03-26 04:52:15
你的问题有两个原因:
数据帧列中的每个条目都需要具有相同的type.
if_else,要求是和否输出具有相同的类型(参见here).)
由于以下两个原因,每次尝试都失败了:
if_else(hpv_post_res == "POS", hpv_post, 0)标识输出为类型日期。由于零不是日期,所以它试图将0转换为日期。如果存在原产地日期,则可以将数值转换为日期。但是没有起源,因此errors.if_else(hpv_post_res == "POS", hpv_post, "negative")试图同时输出日期和字符串类型。this.if_else(hpv_post_res == "POS", hpv_post, NA)将不允许if_else在大多数情况下工作,因为数据帧的列可以采用值和NA。但在最严格的意义上,NA是逻辑类型的。因此,错误.解决方案:
if_else,类似于if_else,但不要求数据类型相同。但是,它将日期转换为数字。因此,如果您的输入列不是date.as.Date(ifelse(hpv_post_res == "POS", hpv_post, NA), origin = lubridate::origin()).base_contactos_3$positivo = base_contactos_3$hpv_post
base_contactos_3$positivo[base_contactos_3$hpv_post_res != "POS"] = NA发布于 2022-03-26 09:33:35
参见@SimonSA的出色回答,解释为什么会发生这种情况。
如果您想将positivo保留为datetime并使用NA的话,另一种解决方案是使用as.POSIXct()将NA强制到日期时间。
library(tidyverse)
base_contactos_3 %>%
mutate(positivo = if_else(
hpv_post_res == "POS",
hpv_post,
as.POSIXct(NA)
))输出:
# A tibble: 6 x 4
id_mujer hpv_post hpv_post_res positivo
<dbl> <dttm> <chr> <dttm>
1 8528 2012-06-12 00:00:00 NEG NA
2 8528 2016-03-17 00:00:00 NEG NA
3 11711 2015-09-30 00:00:00 POS 2015-09-30 00:00:00
4 11711 2015-09-30 00:00:00 POS 2015-09-30 00:00:00
5 11818 2012-12-07 00:00:00 NEG NA
6 11818 2018-05-04 00:00:00 NEG NA 作为快捷方式,lubridate包提供了可以用于相同结果的NA_POSIXct_类型:
library(tidyverse)
library(lubridate)
base_contactos_3 %>%
mutate(positivo = if_else(
hpv_post_res == "POS",
hpv_post,
NA_POSIXct_
))https://stackoverflow.com/questions/71625224
复制相似问题