gpt4 book ai didi

r - 检查R中数据框中NA的开始和结束索引

转载 作者:行者123 更新时间:2023-12-01 12:12:34 25 4
gpt4 key购买 nike

我有一个列名为 sorted_no 的 Dataframe,如下所示

x_n$sorted_no
1 2 NA 3 4 NA NA NA NA NA NA NA 5 NA NA NA NA 6 NA NA NA NA NA 7

我想要此列中 NA 值的开始和结束索引,如下所示

start end
2 4
5 13
13 18
18 24

最佳答案

在基础 R 中:

vec <- scan(text="1  2 NA  3  4 NA NA NA NA NA NA NA  5 NA NA NA NA  6 NA NA NA NA NA  7", what=numeric())

diff_vec <- diff(is.na(c(0,vec)))
# [1] 0 0 1 -1 0 1 0 0 0 0 0 0 -1 1 0 0 0
# [18] -1 1 0 0 0 0 -1

data.frame(start= which(diff_vec==1)-1,
end= which(diff_vec==-1))

# start end
# 1 2 4
# 2 5 13
# 3 13 18
# 4 18 24

c(0,vec) 中的 0 帮助我们确保我们不是以 NA 开头


另一种使用 data.table::rleidtapply 的解决方案:

library(data.table)
do.call(rbind,
tapply(seq_along(vec)[is.na(vec)],rleid(vec)[is.na(vec)],
function(x) data.frame(start=min(x)-1,end=max(x)+1)))

# start end
# 3 2 4
# 6 5 13
# 8 13 18
# 10 18 24

这里我使用 rleid 创建组,使用 seq_along 创建索引,在这些组中我使用 min最大索引。


使用 rle 的基本解决方案:

vec[is.na(vec)] <- Inf
rle_ <- rle(vec)
cumsum_ <- cumsum(rle_$lengths)
infs_ <- which(rle_$value == Inf)
data.frame(start = c(0,cumsum_)[infs_], end = cumsum_[infs_]+1)

# start end
# 1 2 4
# 2 5 13
# 3 13 18
# 4 18 24

base::rleNAs 给予特殊处理,而 data.table::rleid 没有,所以我使用了 Inf,使其不太健壮。

关于r - 检查R中数据框中NA的开始和结束索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50698909/

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