我每天都会观察到大量的缺失值,并试图通过每个人的向量传播第一个非缺失值。
在我到目前为止的搜索中,我在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
函数的任何想法都将非常感激。谢谢!
答案 0 :(得分:6)
1)首先请注意,value
列是一个字符列,其"NA"
值不是NA
,所以我们先在##中修复它。然后创建一个包装函数na.locf.na
,它使用zoo package中的na.locf
并且相同,但默认为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))
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")
修订重新组织演示文稿并添加替代方案。