在R中用ID进行最后观察

时间:2014-05-22 23:06:24

标签: r zoo na

我每天都会观察到大量的缺失值,并试图通过每个人的向量传播第一个非缺失值。

在我到目前为止的搜索中,我在na.locf包中发现了zoo函数;但是,我现在需要根据数据框中的id变量来调整此函数。 ddply对此有正确的作用吗?如果有,有人可以帮助我,请弄清楚如何将输出包含在同一数据框中名为result的新变量中?

这是我到目前为止所做的:

# Load required libraries
library(zoo)
library(plyr)

# Create the data
data <- structure(list(id = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 
              2, 2, 2), day = c(0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 7, 
              8), value = c("NA", "1", "NA", "NA", "NA", "NA", "NA", "NA", 
              "NA", "NA", "1", "NA", "NA", "NA", "NA", "NA")), .Names = c("id", 
              "day", "value"), row.names = c(NA, -16L), class = "data.frame")

# Propagate the value of the first non-missing observation in data$value forward for each id
data$result <- na.locf(data$value, na.rm = FALSE)

对于如何运行每个na.locf id函数的任何想法都将非常感激。谢谢!

1 个答案:

答案 0 :(得分:6)

1)首先请注意,value列是一个字符列,其"NA"值不是NA,所以我们先在##中修复它。然后创建一个包装函数na.locf.na,它使用zoo package中的na.locf并且相同,但默认为na.rm = FALSE。最后使用avena.locf

申请id
library(zoo)

data2 <- transform(data, value = as.numeric(value)) ##

na.locf.na <- function(x, na.rm = FALSE, ...) na.locf(x, na.rm = na.rm, ...)
transform(data2, value = ave(value, id, FUN = na.locf.na))

2)或使用fn中的gsubfn package以紧凑的方式内联na.locf.na的紧凑替代方案:

library(zoo)
library(gsubfn)

transform(data2, value = fn$ave(value, id, FUN = ~ na.locf(x, na.rm = FALSE)))

在这两种情况中的任何一种情况下,结果都是:

   id day value
1   1   0    NA
2   1   1     1
3   1   2     1
4   1   3     1
5   1   4     1
6   1   5     1
7   1   6     1
8   2   0    NA
9   2   1    NA
10  2   2    NA
11  2   3     1
12  2   4     1
13  2   5     1
14  2   6     1
15  2   7     1
16  2   8     1

3)我们可以使用上面的na.locf.na与动物园一起使用dplyr:

library(zoo)
library(dplyr)

data2 <- data %>% mutate(value = as.numeric(value)) # fix value column
data2 %>% group_by(id) %>% mutate(value = na.locf.na(value))

如果dplyr from CRAN在这里不起作用,请尝试使用github:

library(devtools)
install_github("hadley/dplyr")

修订重新组织演示文稿并添加替代方案。