r - 根据对应于特定日期的有效值将日期转换为 NA

标签 r dataframe date dplyr

假设我有

> df
    fu1_date fu1_n_symp   fu5_date fu5_n_symp   fu7_date fu7_n_symp
1 2012-03-05          1 2014-03-05         NA 2016-03-05          1
2 2013-08-09          1 2015-10-09          2 2017-11-09         NA
3 2019-05-05          1 2020-06-07          2 2021-07-09          2

df 表示一个非常大的数据框。在这个例子中,我记录了不同随访日期 fu_date 的症状数 n_symp

我的数据框中的每一行最多有 20 个跟进,fu1_fu2_、...、fu20_。我需要更正我的数据框,这样如果 n_sympNA 那么相应的 fuX_date 应该从 as.Date() 转换NA

您可以看到 第 1 行 在后续 5 (fu5_n_symp == NA) 中有缺失值,但 FU1 或 FU7 没有。因此,第 1 行中的 fu5_date 应从 2014-03-05 转换为 NA

我正在寻找仅在 dplyr 中的解决方案。

预期输出

> df
    fu1_date fu1_n_symp   fu5_date fu5_n_symp   fu7_date fu7_n_symp
1 2012-03-05          1       <NA>         NA 2016-03-05          1
2 2013-08-09          1 2015-10-09          2       <NA>         NA
3 2019-05-05          1 2020-06-07          2 2021-07-09          2

数据

df <- structure(list(fu1_date = structure(c(15404, 15926, 18021), class = "Date"), 
    fu1_n_symp = c(1L, 1L, 1L), fu5_date = structure(c(16134, 
    16717, 18420), class = "Date"), fu5_n_symp = c(NA, 2L, 2L
    ), fu7_date = structure(c(16865, 17479, 18817), class = "Date"), 
    fu7_n_symp = c(1L, NA, 2L)), class = "data.frame", row.names = c(NA, -3L))

最佳答案

使用pivot_longer(),你可以指定".value"names_to来堆叠daten_symp 成对。在这种情况下,必须提供 names_sepnames_pattern 之一来指定应如何拆分列名。然后,您可以轻松地用 NA 替换那些缺少 n_symp 的日期。最后,将长数据旋转得更宽以获得原始格式。

library(dplyr)
library(tidyr)

df %>%
  mutate(id = 1:n()) %>% 
  pivot_longer(-id, names_to = c("fu", ".value"), names_sep = "(?<=\\d)_") %>%
  mutate(date = replace(date, is.na(n_symp), NA)) %>%
  pivot_wider(names_from = fu, values_from = c(date, n_symp),
              names_glue = "{fu}_{.value}", names_vary = "slowest")

# # A tibble: 3 × 7
#      id fu1_date   fu1_n_symp fu5_date   fu5_n_symp fu7_date   fu7_n_symp
#   <int> <date>          <int> <date>          <int> <date>          <int>
# 1     1 2012-03-05          1 NA                 NA 2016-03-05          1
# 2     2 2013-08-09          1 2015-10-09          2 NA                 NA
# 3     3 2019-05-05          1 2020-06-07          2 2021-07-09          2
pivot_wider() 中的names_vary 控制结果列名的组合顺序。

  • “最快”(默认)

    fu1_date   fu5_date   fu7_date   fu1_n_symp fu5_n_symp fu7_n_symp
    
  • “最慢”

    fu1_date   fu1_n_symp fu5_date   fu5_n_symp fu7_date   fu7_n_symp
    

关于r - 根据对应于特定日期的有效值将日期转换为 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74967827/

相关文章:

r - 如何知道情节名称?

python - 网状:无法配置 python3

r - 在数据框中输入附加行作为相邻现有行值之间的中点

r - 在 excel 文件中写入数据框列表

python - Pandas DataFrame 括号访问器 [ ] 更喜欢列还是行?

R:使用 ID/名称提取前 n 个值

python - 摆脱 Python 中日期字符串的前导零?

java - 不明确的结果日期java

即使当前时间是标准时间,Javascript 日期构造函数也默认为夏令时

R 函数 - 未分配时打印