计算NA出现在非缺失值之间

Omr*_*tia 3 r missing-data dplyr

我有一个包含5个时间列(第一年,第二年y等)的数据框,对于某些行,我在非缺失值之间具有NA。示例如下:

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))
Run Code Online (Sandbox Code Playgroud)

我想使用dplyr计算在非缺失值之间缺少值的行数。第13、14和16行就是这样的示例。

我该如何实现?我感觉这与paste遍历整个行并在NA的左侧和右侧看是有关系的...但是不清楚如何进行此操作。

Len*_*nyy 5

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

[1] 3
Run Code Online (Sandbox Code Playgroud)

简而言之:

  1. 连接行

  2. 检查哪些行返回TRUE对于具有匹配的字符串:“数NA-数”(在这种情况下,行131416

  3. 对求和的行求和 TRUE

基于@索托斯评论,这是更好,因为它阻止我们使用apply具有margin = 1

sum(grepl("[[:digit:]]+[NA]+[[:digit:]]", do.call(paste0, df)))
Run Code Online (Sandbox Code Playgroud)

  • 好答案。仅供参考,您可以通过向量化的do.call来省略(可怕的)apply(... margin = 1,...)`,即,do.call(paste0,df) (2认同)