在R中,按照ID进行的最后观察值向前填充。

huangapple go评论125阅读模式
英文:

Last observation carried forward by id in R

问题

我有一些类似这样的纵向数据:

id <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,9)
var1 <- c(0,1,1,1,NA,2,2,NA,NA,NA,1,1,0,1,1,2,1,2,NA,1,1,2,2,NA,NA,2,NA)
var2 <- c(1,NA,NA,2,1,NA,1,1,NA,0,0,1,NA,0,1,1,0,0,0,NA,1,1,1,2,0,NA,2)
visit <- rep(1:3, 9)
dt <- as.data.frame(cbind(id, var1, var2, visit))

每个不同的 id 代表一个患者。visit 是测量周期(即,每个患者应该被测量三次)。
我想要对 var1var2 按照 id 进行最后观察值前移的操作。我在其他帖子中找到了一些代码。它使用了 zoo 包和 gsubfn 包中的函数。它对一个变量运行得很好(见下面的代码):

dt1 <- transform(dt, var1=fn$ave(var1, id, FUN= ~ na.locf(x, na.rm = FALSE)))

我想知道如何在多个列上执行相同的操作?谢谢。

Note: 由于您要求不要翻译代码部分,我只返回非代码部分的翻译。上述内容已经翻译完毕。

英文:

I have some longitudinal data like this:

id <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,9)
var1 <- c(0,1,1,1,NA,2,2,NA,NA,NA,1,1,0,1,1,2,1,2,NA,1,1,2,2,NA,NA,2,NA)
var2 <- c(1,NA,NA,2,1,NA,1,1,NA,0,0,1,NA,0,1,1,0,0,0,NA,1,1,1,2,0,NA,2)
visit <- rep(1:3, 9)
dt <- as.data.frame(cbind(id, var1, var2, visit))

Each distinct id represents a patient. visit is the measuring cycle (i.e., each patient should be measured three times).
I would like to conduct the last observation carried forward on var1 and var2 by patient id. I found some codes in other post. It used function from package zoo and package gsubfn. It worked well for one variable (see below)

dt1 <- transform(dt, var1=fn$ave(var1, id, FUN= ~ na.locf(x, na.rm = FALSE)))

I'm wondering how to do it with multiple columns? Thank you.

答案1

得分: 3

使用dplyr可以执行

library(dplyr)
dt %>% 
  group_by(id) %>%
  mutate(across(var1:var2, ~zoo::na.locf(.x, na.rm=FALSE)))
英文:

Using dplyr you can do

library(dplyr)
dt %>% 
  group_by(id) %>%
  mutate(across(var1:var2, ~zoo::na.locf(.x, na.rm=FALSE)))

huangapple
  • 本文由 发表于 2023年6月8日 23:07:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/76433279.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定