计算一行中某些单元格中有多少个值不是NA(以R为单位)

cra*_*lly 3 r dplyr

我有一个包含许多列的数据框。对于数据帧的每一行,我想获得不适用的列数。问题是我只对其中几列感兴趣,并且想(有效地)将这些列调出。

在下面的伪样本中使用mutate方法可以给我正确的答案。

library(stringr)

df  <- data_frame(
         id = 1:10
       , name = fruit[1:10]
       , word1 = c(words[1:5],NA,words[7:10])
       , word2 = words[11:20]
       , word3 = c(NA,NA,NA,words[25],NA,NA,words[32],NA,NA,words[65])
    ) %>%
    mutate(
        n_words = 
            as.numeric(!is.na(word1)) + 
            as.numeric(!is.na(word2)) + 
            as.numeric(!is.na(word3)) 
    )
Run Code Online (Sandbox Code Playgroud)

但是,即使是像这样的玩具示例,也很难打字和阅读-当我要计数的列数超过3时,它几乎没有用。是否有更多的R / dplyr-y方法可以编写此代码,select()例如使用样式语法(例如n_words = !count_blank(word1:word3))?

我考虑过使用summarize()sans分组,但是,我需要计数的列中的数据,如果将它们添加到中group_by,则又需要再次调用几乎所有列。

Hub*_*rtL 6

您可以is.na()在所选列上使用,然后rowSums()在结果上使用:

library(stringr)
df <- data_frame(
  id = 1:10
  , name = fruit[1:10]
  , word1 = c(words[1:5],NA,words[7:10])
  , word2 = words[11:20]
  , word3 = c(NA,NA,NA,words[25],NA,NA,words[32],NA,NA,words[65]))

df$word_count <- rowSums( !is.na( df [,3:5]))

df
      id         name    word1     word2   word3 n_words
   <int>        <chr>    <chr>     <chr>   <chr>   <dbl>
1      1        apple        a    actual    <NA>       2
2      2      apricot     able       add    <NA>       2
3      3      avocado    about   address    <NA>       2
4      4       banana absolute     admit   agree       3
5      5  bell pepper   accept advertise    <NA>       2
6      6     bilberry     <NA>    affect    <NA>       1
7      7   blackberry  achieve    afford alright       3
8      8 blackcurrant   across     after    <NA>       2
9      9 blood orange      act afternoon    <NA>       2
10    10    blueberry   active     again   awful       3
Run Code Online (Sandbox Code Playgroud)

编辑

使用dplyr您可以这样做:

df %>% 
    select(3:5) %>% 
    is.na %>% 
    `!` %>% 
    rowSums
Run Code Online (Sandbox Code Playgroud)