gpt4 book ai didi

r - 根据按组增加的值推进观察

转载 作者:行者123 更新时间:2023-12-01 03:04:29 26 4
gpt4 key购买 nike

我想我有一个简单的问题,但我正在寻找更有效的(就所需的计算能力而言)方法来执行以下操作。
我有一个包含数千列的数据集,我只想为每个列进行 locf(结转上次观察)。
我需要尊重的唯一条件是最高值被结转

我的数据看起来像这样

df <- data.frame("ID" = c("Alpha", "Alpha", "Alpha", "Alpha", "Alpha", "Beta", "Beta", "Beta", "Beta", "Beta"), "Year" = c(1970, 1980, 1990, 2000, 2010, 1970, 1980, 1990, 2000, 2010), "Var" = c(NA, NA, 0, NA, NA, NA, 1, NA, 2, NA), "otherVar" = c(NA, 2.34, 1.3, NA, NA, 1.3, NA, 3.5, 1.5, NA))
df
#> ID Year Var otherVar
#> 1 Alpha 1970 NA NA
#> 2 Alpha 1980 NA 2.34
#> 3 Alpha 1990 0 1.30
#> 4 Alpha 2000 NA NA
#> 5 Alpha 2010 NA NA
#> 6 Beta 1970 NA 1.30
#> 7 Beta 1980 1 NA
#> 8 Beta 1990 NA 3.50
#> 9 Beta 2000 2 1.50
#> 10 Beta 2010 NA NA

我想获得以下数据
final <- data.frame("ID" = c("Alpha", "Alpha", "Alpha", "Alpha", "Alpha", "Beta", "Beta", "Beta", "Beta", "Beta"), "Year" = c(1970, 1980, 1990, 2000, 2010, 1970, 1980, 1990, 2000, 2010), "Var" = c(NA, NA, 0, 0, 0, NA, 1, 1, 2, 2), "otherVar" = c(NA, 2.34, 2.34, 2.34, 2.34, 1.3, 1.3, 3.5, 3.5, 3.5))
final
#> ID Year Var otherVar
#> 1 Alpha 1970 NA NA
#> 2 Alpha 1980 NA 2.34
#> 3 Alpha 1990 0 2.34
#> 4 Alpha 2000 0 2.34
#> 5 Alpha 2010 0 2.34
#> 6 Beta 1970 NA 1.30
#> 7 Beta 1980 1 1.30
#> 8 Beta 1990 1 3.50
#> 9 Beta 2000 2 3.50
#> 10 Beta 2010 2 3.50

正如我所提到的,这个想法是,对于我的每个变量,我都希望用最后一个观察结果来填充 NA。但我只想保留最高值(value)。例如 otherVar 1970 年为 1.3,因此该值被结转到 1980 年以填充 NA。 1990年值 otherVar是 3.5,所以它“取代”了 1.3 和 otherVar 的分数1990 年是 3.5。最后,2000 年的得分为 otherVar是 1.5。由于 1.5 < 3.5,在最终数据集中,较高的值被结转。

我想找到计算量最少的方法来执行此操作,因为我必须为数千个变量执行此操作。

非常感谢您的帮助

此致

最佳答案

我们可以使用 cummax之后 replace用 0 对 NA 进行修改,然后将 0 改回 NA

library(dplyr)
library(tidyr)
df %>%
group_by(ID) %>%
mutate_at(3:4, ~ na_if(cummax(replace_na(., -999)), -999))

关于r - 根据按组增加的值推进观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59094287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com