根据某些规则修改数据框的列

问题描述 投票:0回答:1

我正在处理下一个示例,以便将一些想法应用于随机过程。假设我有一个数据框如下:

idp<-sort(rep(c("A","B","C","D"),10))
a1<-c(1,1,1,2,3,4,3,4,2,2)
a2<-c(3,3,NA,NA,4,1,2,3,1,1)
a3<-c(NA,NA,1,1,2,2,4,NA,NA,1)
a4<-c(4,3,2,1,NA,NA,NA,1,2,3)

idp
dat<-data.frame(idp,outcome=c(a1,a2,a3,a4))
dat

在数据帧中,idp例如是一个人的标识。在另一列结果中,每个数字代表一种状态。数字四是一种类似于死亡的状态。然后,这个想法在一个向量中,对应于一个特定的人,数字四(状态4),并且这个人的后续数字必须是四。另一方面,在另一种情况下。如果存在缺失,我们假设前一个状态应该位于缺失值中,如果链以 NA 开头,那么我们应该选择向量中出现的第一个状态

由于我有很多国内流离失所者和许多其他案例,我认为我已经总结了其中的一些,但我不知道在这种情况下如何进行。

r dataframe data-cleaning data-transform
1个回答
0
投票

根据idp拆分,填充NA,然后找到4,如果有则填充4:

#split per idp and loop
l <- lapply(split(dat$outcome, dat$idp), function(i){
  # fill NA
  out <- zoo::na.locf(zoo::na.locf(i, na.rm = FALSE),
                      na.rm = FALSE, fromLast = TRUE)
  # fill 4 if any
  ix4 <- min(which(out == 4))
  if(length(ix4) > 0){ out[ ix4:length(out) ] <- 4 }
  
  out
  })


l
# $A
# [1] 1 1 1 2 3 4 4 4 4 4
# 
# $B
# [1] 3 3 3 3 4 4 4 4 4 4
# 
# $C
# [1] 1 1 1 1 2 2 4 4 4 4
# 
# $D
# [1] 4 4 4 4 4 4 4 4 4 4

# convert back to dataframe
head(stack(l))
#   values ind
# 1      1   A
# 2      1   A
# 3      1   A
# 4      2   A
# 5      3   A
# 6      4   A
© www.soinside.com 2019 - 2024. All rights reserved.