我有一个包含许多列的数据框。对于数据帧的每一行,我想获得不适用的列数。问题是我只对其中几列感兴趣,并且想(有效地)将这些列调出。
在下面的伪样本中使用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,则又需要再次调用几乎所有列。
您可以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)
| 归档时间: |
|
| 查看次数: |
2892 次 |
| 最近记录: |