我每天都有大量缺失值的观察结果,并试图通过每个人的向量传播第一个非缺失值.
在我到目前为止的搜索中,我发现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)
Run Code Online (Sandbox Code Playgroud)
任何关于如何运行na.locf每个功能的想法都id将非常感激.谢谢!
1)首先请注意,value列是一个带有"NA"值的字符列,而不是NA值,所以我们先在##中修复它.然后创建一个包装器函数na.locf.na,它na.locf在zoo包中使用,除了默认值之外是相同的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)或使用本紧凑的替代FN从gsubfn包来表示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)
如果来自CRAN的dplyr在这里不起作用,请尝试使用github中的一个:
library(devtools)
install_github("hadley/dplyr")
Run Code Online (Sandbox Code Playgroud)
修订重组了演示文稿并增加了替代方案.