在R中用ID进行最后观察

Ent*_*opy 4 r zoo na

我每天都有大量缺失值的观察结果,并试图通过每个人的向量传播第一个非缺失值.

在我到目前为止的搜索中,我发现na.locfzoo包中的功能; 但是,我现在需要根据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)
Run Code Online (Sandbox Code Playgroud)

任何关于如何运行na.locf每个功能的想法都id将非常感激.谢谢!

G. *_*eck 7

1)首先请注意,value列是一个带有"NA"值的字符列,而不是NA值,所以我们先在##中修复它.然后创建一个包装器函数na.locf.na,它na.locfzoo包中使用,除了默认值之外是相同的na.rm = FALSE.最后使用ave申请na.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))
Run Code Online (Sandbox Code Playgroud)

2)或使用本紧凑的替代FNgsubfn包来表示na.locf.na在一个更紧凑的方式内嵌:

library(zoo)
library(gsubfn)

transform(data2, value = fn$ave(value, id, FUN = ~ na.locf(x, na.rm = FALSE)))
Run Code Online (Sandbox Code Playgroud)

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

   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
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

如果来自CRANdplyr在这里不起作用,请尝试使用github中的一个:

library(devtools)
install_github("hadley/dplyr")
Run Code Online (Sandbox Code Playgroud)

修订重组了演示文稿并增加了替代方案.