如何找到R中非NA行的最长序列?

raogr8fs  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(104)

我有一个包含许多变量的有序 Dataframe ,我希望从与某个特定列的最长非NA行序列关联的所有列中提取数据。有简单的方法吗?我尝试过na.contiguous()函数,但我的数据没有格式化为时间序列。
我的直觉是创建一个运行计数器,它确定一行是否有NA,然后确定没有NA的连续行的数量。然后我将把它放在if语句中,以便每次遇到NA时都重新启动,输出一个 Dataframe ,其中包含每个非NA序列的长度。我可以用它来找到最长的序列。这看起来效率很低,所以我想知道是否有更好的方法!

o8x7eapl

o8x7eapl1#

如果我理解正确的话:
[I]我希望从与一个特定列的非NA行的最长序列关联的所有列中提取数据
您有一个感兴趣的列,将其命名为WANT,并希望从WANT中具有最高连续非NA值的单行数据中分离出所有列。
示例数据

df <- data.frame(A = LETTERS[1:10],
                 B = LETTERS[1:10],
                 C = LETTERS[1:10],
                 WANT = LETTERS[1:10],
                 E = LETTERS[1:10])

set.seed(123)
df[sample(1:nrow(df), 2), 4] <- NA

#   A B C WANT E
#1  A A A    A A
#2  B B B    B B
#3  C C C <NA> C
#4  D D D    D D
#5  E E E    E E
#6  F F F    F F
#7  G G G    G G
#8  H H H    H H
#9  I I I    I I # want to isolate this row (#9) since most non-NA in WANT
#10 J J J <NA> J

在这里,您需要所有I值,因为它是WANT中运行时间最长的非NA值所在的行。
如果我对您的问题的理解是正确的,我们可以将最佳答案found here扩展到您的情况,这将创建一个数据框,其中包含每列连续非NA值的运行计数。
使用此函数的好处是,它将计算所有列(任何类型,即字符、数字)上的连续非NA运行,然后您可以使用which.max()对任何列进行索引

# from @jay.sf at https://stackoverflow.com/questions/61841400/count-consecutive-non-na-items
res <- as.data.frame(lapply(lapply(df, is.na), function(x) {
  r <- rle(x)
  s <- sapply(r$lengths, seq_len)
  s[r$values] <- lapply(s[r$values], `*`, 0)
  unlist(s)
}))

# index using which.max()
want_data <- df[which.max(res$WANT), ]

#> want_data
#  A B C WANT E
#9 I I I    I I

如果这不正确,请编辑您的问题以使其清晰。

相关问题