我有一些纵向的患者数据,其中包括一列描述患者目前是否或曾经吸烟的列.如果患者后来被登记为从未吸烟,我想回填缺失的值only.我不能简单地使用tiydr::fill,因为它不允许对值进行歧视.

给出下面的例子,我希望将S的id==1改为never_smoker,而id==2应该保持不变,因为我们无法准确地推断患者何时开始吸烟.

df <- tibble::tribble(
  ~id, ~visit, ~smoking,
  1, 1, NA,
  1, 2, NA,
  1, 3, "never_smoker",
  2, 1, NA,
  2, 2, NA,
  2, 3, "current_smoker"
)

应该会导致

expected_result <- tibble::tribble(
  ~id, ~visit, ~smoking,
  1, 1, "never_smoker",
  1, 2, "never_smoker",
  1, 3, "never_smoker",
  2, 1, NA,
  2, 2, NA,
  2, 3, "current_smoker"
)

我想出了这个解决方案,看起来很管用,但需要颠倒两次.我想一定有更好的方法来做这件事吧?

df %>%
    group_by(id) %>%
    mutate(smoking = rev(accumulate(rev(smoking), ~ ifelse(is.na(.y) & .x == "never_smoker", "never_smoker", .y))))

推荐答案

您可以将最高的visit标识为值"never_smoker",然后填写小于此值的访问量.

library(dplyr)

df %>%
  group_by(id) %>%
  mutate(smoking = if_else(
    visit < suppressWarnings(max(visit[!is.na(smoking) & smoking == "never_smoker"])), 
    "never_smoker", 
    smoking
  ))

包含suppressWarnings()是因为如果没有"never_smoker"的值,max()将警告返回-Inf,但在这种情况下,这是我们想要的行为.

结果:

# A tibble: 6 × 3
# Groups:   id [2]
     id visit smoking       
  <dbl> <dbl> <chr>         
1     1     1 never_smoker  
2     1     2 never_smoker  
3     1     3 never_smoker  
4     2     1 <NA>          
5     2     2 <NA>          
6     2     3 current_smoker

R相关问答推荐

使用对管道内单元格的引用生成新变量

根据R中两个变量的两个条件删除带有dspirr的行

pickerInput用于显示一条或多条geom_hline,这些线在图中具有不同 colored颜色

R中的子集文件—读取文件名索引为4位数字序列,例如0001到4000,而不是1到4000)

为什么横向页面会导致officeverse中的页码/节头/页脚出现问题?

将非重复序列高效转换为长格式

IMF IFS数据以R表示

汇总数据表中两个特定列条目的值

如何得到每四个元素向量R?

SHINY:使用JS函数应用的CSS样式显示HTML表格

R如何计算现有行的总和以添加新的数据行

在带有`R`中的`ggmosaic`的马赛克图中使用图案而不是 colored颜色

将项粘贴到向量中,并将它们分组为x的倍数,用空格分隔

如何平滑或忽略R中变量的微小变化?

如何在ggplot2中创建多个y轴(每个变量一个)

在gggraph中显示来自不同数据帧的单个值

我需要使用ggplot2制作堆叠条形图

注释不会绘制在所有ggplot2面上

如何使用grepl()在数据帧列表中 Select 特定字符串?

使用其他DF中的文件名将列表中的每个元素保存到文件中