我正在使用试验参与者血液测试结果的数据框架,其中有一些零星的缺失值(分析物失败).幸运的是,我们有两个非常接近的时间点,所以对于时间点1的缺失值,我希望从时间点2估算相应的值.

以下是一些示例数据:

           timepoint = c(1,1,1,1,1,2,2,2,2,2),
           fst_test = c(NA,sample(1:40,9, replace =F)),
           scd_test = c(sample(1:20,8, replace = F),NA,NA))

到目前为止,我一直在更广泛地旋转,然后手动合并相应的测试结果,如下所示:

test %>% 
  pivot_wider(names_from = timepoint, 
              values_from = fst_test:scd_test) %>%
  mutate(fst_test_imputed = coalesce(fst_test_1, fst_test_2),
         scd_test_imputed = coalesce(scd_test_1, scd_test_2)) %>% 
  select(ID, fst_test_imputed, scd_test_imputed)

然而,对于15个测试来说,这是很麻烦的...

非常感谢您的帮助!!

推荐答案

在"timepoint"上创建一个rowid的分组列后,我们可以使用fill(正如OP提到的,用"timepoint"列中相应的数据点替换).然后,我们只需要fill,并将.direction指定为"updown",以先用后面的非NA填充前面的值中的NA(如果只需要处理'timepoint'1中的'NA',则更改.direction = "up")

library(dplyr)
library(tidyr)
library(数据.table)
test %>%
    group_by(grp = rowid(timepoint)) %>%
    fill(fst_test, scd_test, .direction = "updown") %>%
    ungroup %>% 
    select(-grp)

数据

test <- structure(list(timepoint = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2), 
fst_test = c(NA, 
16L, 30L, 29L, 14L, 32L, 21L, 20L, 3L, 23L), scd_test = c(18L, 
17L, 8L, 20L, 1L, 10L, 14L, 19L, NA, NA)),
 class = "数据.frame", row.names = c(NA, 
-10L))

R相关问答推荐

R中的Fasttext langue_identification返回太多参数-如何与文本匹配?

R:如何自动化变量创建过程,其中我需要基于ifelse()为现有变量的每个级别创建一个单独的变量

多个ggpredicate对象的平均值

从开始时间和结束时间导出时间

使用sf或terra的LINESTRAING的累积长度

提取具有连续零值的行,如果它们前面有R中的有效值

在R中使用download. file().奇怪的URL?

标识R中多个列中缺少的唯一值

为什么当用osmdata映射R时会得到相邻状态?

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

您是否可以使用facet_rap设置一个较低的限制来对ggmap上的比例中断进行zoom ?

以字符格式导入的ExcelElectron 表格日期列标题

具有重复元素的维恩图

按时间顺序对不同事件进行分组

如何使这些react 表对象相互独立?

如何移除GGPlot中超出与面相交的任何格网像元

有没有办法定制Plot(allEffects())面板标题?

TidyVerse中长度不等的列结合向量

如何调整一个facet_work()面板内的框图和移动标签之间的水平宽度?

R中的Desolve:返回的导数数错误