我有一个包含很多列的数据框。对于数据框的每一行,我想计算 NA 的列数。问题是我只对一些列感兴趣,并且想要(有效地)调用这些列。
像我在下面的假样本中所做的那样使用 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))
)
然而,即使是像这样的玩具示例,打字和阅读也是很痛苦的——当我要计算的列数超过 3 列时,这在很大程度上是无用的。是否有更多的 R/dplyr-y 方式来写这个,也许使用
select()
样式语法(例如 n_words = !count_blank(word1:word3)
)?我考虑使用
summarize()
sans 分组,但是,我需要我正在计算的列中的数据,如果我将它们添加到 group_by
,我在同一条船上再次调用几乎所有的列。
最佳答案
您可以使用 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
编辑
使用
dplyr
你可以这样做:df %>%
select(3:5) %>%
is.na %>%
`!` %>%
rowSums
关于r - 计算一行的某些单元格中有多少个值不是 NA(在 R 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39648111/