首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不能用变体和日期

不能用变体和日期
EN

Stack Overflow用户
提问于 2022-03-26 04:08:05
回答 3查看 622关注 0票数 1

我有一个数据库:

代码语言:javascript
运行
复制
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"

))
代码语言:javascript
运行
复制
# 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。问题是当我这么做的时候:

代码语言:javascript
运行
复制
base_contactos_3 %>%

mutate(positivo= if_else(hpv_post_res=="POS", hpv_post, 0))

由于某种原因,我得到了这个错误:

代码语言:javascript
运行
复制
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,而是放了一个字符串,比如:

代码语言:javascript
运行
复制
base_contactos_3 %>%

mutate(positivo= if_else(hpv_post_res=="POS", hpv_post, "negative"))

它给了我这个错误:

代码语言:javascript
运行
复制
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(这是我更喜欢的选项),它会给出以下错误:

代码语言:javascript
运行
复制
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.
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-03-26 04:40:39

错误告诉您原因:您“想要变异”的列是字符类型"POS“,如果为真,但如果为FALSE,则提供日期。这就是为什么,如果你给一个角色,它的工作。

第一个对我有用的想法:如果你觉得它没有用,请告诉我。

代码语言:javascript
运行
复制
 base_contactos_3%>%
  mutate(positivo= if_else(hpv_post_res=="POS", as.character(hpv_post), as.character(0)))

给出以下结果。由于将日期和字符合并为TRUE/FALSE的选择,因此在结果列中只能有1。(因为时间是0,所以只取日期)

代码语言:javascript
运行
复制
# 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
票数 2
EN

Stack Overflow用户

发布于 2022-03-26 04:52:15

你的问题有两个原因:

数据帧列中的每个条目都需要具有相同的type.

  • if_else,要求是和否输出具有相同的类型(参见here).

)

由于以下两个原因,每次尝试都失败了:

  1. if_else(hpv_post_res == "POS", hpv_post, 0)标识输出为类型日期。由于零不是日期,所以它试图将0转换为日期。如果存在原产地日期,则可以将数值转换为日期。但是没有起源,因此errors.
  2. if_else(hpv_post_res == "POS", hpv_post, "negative")试图同时输出日期和字符串类型。this.
  3. if_else(hpv_post_res == "POS", hpv_post, NA)将不允许if_else在大多数情况下工作,因为数据帧的列可以采用值和NA。但在最严格的意义上,NA是逻辑类型的。因此,错误.

解决方案:

  • ,如@anuanand所建议的,您可以转换为if_else,类似于if_else,但不要求数据类型相同。但是,它将日期转换为数字。因此,如果您的输入列不是date.
  • Following this解决方案类型,那么这将是一个解决方案,您可以找到它的来源。然后您可以使用as.Date(ifelse(hpv_post_res == "POS", hpv_post, NA), origin = lubridate::origin()).
  • if方法:您愿意走出dplyr,您可以使用逻辑索引:

代码语言:javascript
运行
复制
base_contactos_3$positivo = base_contactos_3$hpv_post
base_contactos_3$positivo[base_contactos_3$hpv_post_res != "POS"] = NA
票数 1
EN

Stack Overflow用户

发布于 2022-03-26 09:33:35

参见@SimonSA的出色回答,解释为什么会发生这种情况。

如果您想将positivo保留为datetime并使用NA的话,另一种解决方案是使用as.POSIXct()NA强制到日期时间。

代码语言:javascript
运行
复制
library(tidyverse)

base_contactos_3 %>%
  mutate(positivo = if_else(
    hpv_post_res == "POS", 
    hpv_post, 
    as.POSIXct(NA)
  ))

输出:

代码语言:javascript
运行
复制
# 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_类型:

代码语言:javascript
运行
复制
library(tidyverse)
library(lubridate)

base_contactos_3 %>%
  mutate(positivo = if_else(
    hpv_post_res == "POS", 
    hpv_post, 
    NA_POSIXct_
  ))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71625224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档