计算非缺失值之间出现的缺失值数量

3

我有一个数据框,其中包含5个时间列(第1年,第2年等),对于一些行,我在非缺失值之间有缺失值。示例如下:

df = structure(list(FirstYStage = c(NA, 3.2, 3.1, NA, NA, 2, 1, 3.2, 
3.1, 1, 2, 5, 2, NA, NA, NA, NA, 2, 3.1, 1), SecondYStage = c(NA, 
3.1, 3.1, NA, NA, 2, 1, 4, 3.1, 1, NA, 5, 3.1, 3.2, 2, 3.1, NA, 
2, 3.1, 1), ThirdYStage = c(NA, NA, 3.1, NA, NA, 3.2, 1, 4, NA, 
1, NA, NA, 3.2, NA, 2, 3.2, NA, NA, 2, 1), FourthYStage = c(NA, 
NA, 3.1, NA, NA, NA, 1, 4, NA, 1, NA, NA, NA, 4, 2, NA, NA, NA, 
2, 1), FifthYStage = c(NA, NA, 2, NA, NA, NA, 1, 5, NA, NA, NA, 
NA, 3.2, NA, 2, 3.2, NA, NA, 2, 1)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -20L))

我希望使用dplyr计算中间有缺失值非缺失值行的数量。第13、14和16行就是这样的例子。
我该如何实现呢?我感觉这与将整个行paste在一起并在NA的左右查找有关...但不清楚如何继续进行。

你想让你的输出为13、14和16吗? - Ronak Shah
@Ronak Shah 或者只有3(计数) - Omry Atia
1个回答

5
sum(grepl("[[:digit:]]+[NA]+[[:digit:]]", apply(df, 1, paste, collapse = "")))

[1] 3

简而言之:
  1. 连接行

  2. 检查哪些行返回 TRUE,表示匹配字符串 "number-NA-number"(在此情况下,第 131416 行)

  3. 对评估为 TRUE 的行求和

根据 @Sotos 的评论,这样做甚至更好,因为它防止我们使用 applymargin = 1
sum(grepl("[[:digit:]]+[NA]+[[:digit:]]", do.call(paste0, df)))

2
不错的回答。顺便提一下,你可以用向量化的 do.call 来省略那个(可怕的)apply(...margin = 1, ...),即 do.call(paste0, df) - Sotos
@Lennyy,你是否知道一种方法来判断NA前面的数字是大于还是小于后面的数字? - Omry Atia
我可能有一些普遍的想法,但您是否愿意发布一个新问题(连同期望的输出),以便我们可以保持这个主题的整洁? - Lennyy
1
@Lennyy 完成。https://stackoverflow.com/questions/56491759/progression-of-non-missing-values-that-have-missing-values-in-between - Omry Atia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接