gpt4 book ai didi

r - 按组查找第一个和最后一个 NA 值的全局索引

转载 作者:行者123 更新时间:2023-12-01 21:47:43 24 4
gpt4 key购买 nike

我有一个表格的数据集

#create data.frame
df <- data.frame(id = rep(1:3,each=10),
value = rnorm(30))

#throw in some NAs
df[c(1:5, 25:30),2] <- NA

df[1:10,]
id value
1 1 NA
2 1 NA
3 1 NA
4 1 NA
5 1 NA
6 1 -1.0763008
7 1 -0.4026228
8 1 1.6110506
9 1 -1.0626593
10 1 -0.4058101

我想按组查找第一个和最后一个非 NA 值。我尝试编写一个函数来执行此操作,如果没有分组,它可以正常工作:

first.last.non.na = function(x){
return(c(min(which(!is.na(x))),max(which(!is.na(x)))))
}

当我尝试将它与聚合结合使用时,不幸的是,它只返回 组中第一个和最后一个非 NA 值的索引(正如预期的那样):

aggregate(df[,2], by = list(df[,1]), FUN = first.last.non.na)
Group.1 x.1 x.2
1 1 6 10
2 2 1 10
3 3 1 4

我想要的输出是第一个和最后一个非 NA 值的“全局”索引,即

  Group.1 x.1 x.2
1 1 6 10
2 2 11 20
3 3 21 24

任何解决方案也适用于超大数据集?

最佳答案

主要思想是在分组之前根据行号创建一个变量。使用 dplyr,

library(dplyr)

df %>%
mutate(rn = row_number()) %>%
group_by(id) %>%
summarise(v1 = first(rn[!is.na(value)]),
v2 = last(rn[!is.na(value)]))

这给出了,

# A tibble: 3 x 3
id v1 v2
<int> <int> <int>
1 1 6 10
2 2 11 20
3 3 21 24

关于r - 按组查找第一个和最后一个 NA 值的全局索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60078927/

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