【问题标题】:Carry Last Observation Forward by ID in R在 R 中通过 ID 进行最后一次观察
【发布时间】:2014-05-22 23:06:23
【问题描述】:

我每天观察到很多缺失值,并试图通过每个个体的向量传播第一个非缺失值。

在我目前所做的搜索中,我在zoo 包中发现了na.locf 函数;但是,我现在需要根据我的数据框中的 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)

任何关于如何通过每个id 运行na.locf 函数的想法将不胜感激。谢谢!

【问题讨论】:

    标签: r zoo na


    【解决方案1】:

    1) 首先注意value 列是具有"NA" 值的字符列,而不是NA 值,所以让我们先在## 中修复它。然后创建一个包装函数na.locf.na,它在zoo package 中使用na.locf,除了默认为na.rm = FALSE 之外是相同的。最后用ave申请na.locf by 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 中的fn 以更紧凑的方式内联表示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 和 zoo:

    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")
    

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

    【讨论】:

    • 绝对完美——谢谢!我以前从未使用过transform 函数,但我一定会进一步研究它。再次感谢。
    猜你喜欢
    • 2021-06-27
    • 1970-01-01
    • 2016-09-02
    • 2018-07-01
    • 2021-09-25
    • 2011-02-16
    • 2019-07-19
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多