считать NA, появляющиеся между не пропущенными значениями - PullRequest
3 голосов
/ 07 июня 2019

У меня есть фрейм данных с 5 временными столбцами (1-й год, второй 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))

Я бы хотел посчитать, используя dplyr, количество строк, в которых пропущены значения между не пропущенными значениями. Строки 13, 14 и 16 являются примерами этого.

Как мне этого добиться? У меня такое чувство, что это связано с paste, когда я весь ряд и смотрю налево и направо от АН ... но не ясно, как это сделать.

1 Ответ

5 голосов
/ 07 июня 2019
sum(grepl("[[:digit:]]+[NA]+[[:digit:]]", apply(df, 1, paste, collapse = "")))

[1] 3

Вкратце:

  1. объединить строки

  2. проверить, какие строки возвращают TRUE для совпадения со строкой: "число-NA-номер" (в данном случае строки 13, 14 и 16)

  3. суммируют строки, которые оцениваются в TRUE

На основании комментария @ Sotos, это даже лучше, так как это мешает нам использовать apply с margin = 1:

sum(grepl("[[:digit:]]+[NA]+[[:digit:]]", do.call(paste0, df)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...