我有一个数据框,其中包含一段时间内同一主题的重复测量。我想要找到的是一种简单的方法,可以将这些数据从非单调缺失转换为单调丢失。
e.g。 id 1是单调的:1,NA,NA,NA id 3是非单调的:0,NA,0,0 id 4是非单调的:1,1,NA,1
我希望id = 3为Y = c(0,NA,NA,NA),id = 4为Y = c(1,1,NA,NA)。
建议?
包括玩具数据集:
df=structure(list(id = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L,
3L, 4L, 1L, 2L, 3L, 4L), Y = c(1L, 1L, 0L, 1L, NA, 1L, NA, 1L,
NA, 1L, 0L, NA, NA, 0L, 0L, 1L), X = c(5L, 6L, 7L, 8L, 3L, 5L,
6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L, 5L, 6L), t = c(1L, 1L, 1L, 1L,
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L)), .Names = c("id",
"Y", "X", "t"), class = "data.frame", row.names = c(NA, -16L))
答案 0 :(得分:5)
您可以使用is.na <-
并cumsum
传播NA
个值:
df <- within(df, Y <- ave(Y, id, FUN = function(x) {
is.na(x) <- is.na(cumsum(x))
x
}))
df[order(df$id),]
# id Y X t
# 1 1 1 5 1
# 5 1 NA 3 2
# 9 1 NA 8 3
# 13 1 NA 3 4
# 2 2 1 6 1
# 6 2 1 5 2
# 10 2 1 9 3
# 14 2 0 4 4
# 3 3 0 7 1
# 7 3 NA 6 2
# 11 3 NA 1 3
# 15 3 NA 5 4
# 4 4 1 8 1
# 8 4 1 7 2
# 12 4 NA 2 3
# 16 4 NA 6 4
答案 1 :(得分:3)
您可以尝试:
df$newcol<-ave(df$Y,df$id,FUN=function(x) NA^is.na(cumsum(x))*x)
# id Y X t newcol
#1 1 1 5 1 1
#2 2 1 6 1 1
#3 3 0 7 1 0
#4 4 1 8 1 1
#5 1 NA 3 2 NA
#6 2 1 5 2 1
#7 3 NA 6 2 NA
#8 4 1 7 2 1
#9 1 NA 8 3 NA
#10 2 1 9 3 1
#11 3 0 1 3 NA
#12 4 NA 2 3 NA
#13 1 NA 3 4 NA
#14 2 0 4 4 0
#15 3 0 5 4 NA
#16 4 1 6 4 NA