计算dplyr中列子集的按行计数

时间:2018-08-10 09:19:21

标签: r dplyr

我想使用dplyr在行的子集中逐行计算某些文本(或因子级别)的实例数。

以下是输入内容:

> input_df
  num_col_1 num_col_2 text_col_1 text_col_2
1         1         4        yes        yes
2         2         5         no        yes
3         3         6         no       <NA>

这是所需的输出:

> output_df
  num_col_1 num_col_2 text_col_1 text_col_2 sum_yes
1         1         4        yes        yes       2
2         2         5         no        yes       1
3         3         6         no       <NA>       0

sum_yes中,我们计算了该行中“是”的数量。

我尝试了两种方法:

尝试的解决方案1:

text_cols = c("text_col_1","text_col_2")
df = input_df %>% mutate(sum_yes = rowSums( select(text_cols) == "yes" ), na.rm = TRUE)

错误:

Error in mutate_impl(.data, dots) : 
  Evaluation error: no applicable method for 'select_' applied to an object of class "character".

尝试的解决方案2:

text_cols = c("text_col_1","text_col_2")
df = input_df %>% select(text_cols) %>% rowsum("yes", na.rm = TRUE)

错误:

Error in rowsum.data.frame(., "yes", na.rm = TRUE) : 
  incorrect length for 'group'

2 个答案:

答案 0 :(得分:2)

我们可以使用mutate并为每一行取“是”的总和。

library(dplyr)    
df %>%
  mutate(sum_yes = rowSums(.[text_cols] == "yes"))

灵感来自this答案。


或者我们可以将dorowwise一起使用

df %>%
  rowwise() %>%
  do((.) %>% as.data.frame %>% 
      mutate(sum_yes = sum(.=="yes")))

#   num_col_1 num_col_2 text_col_1 text_col_2 sum_yes
#*     <int>     <int> <fct>      <fct>        <int>
#1         1         4 yes        yes              2
#2         2         5 no         yes              1
#3         3         6 no         <NA>             0

或者没有dorowwise

的东西
df %>%
  select(text_cols) %>%
  mutate(sum_yes = rowSums(. == "yes")) 

#  text_col_1 text_col_2 sum_yes
#1        yes        yes       2
#2         no        yes       1
#3         no       <NA>       0

在基数R中,它实际上更简单

df$sum_yes <- rowSums(df[text_cols] == "yes")

答案 1 :(得分:1)

我们也可以将reducemap一起使用

library(tidyverse)
df %>% 
  select(text_cols) %>% 
  map(~ .x == "yes" & !is.na(.x)) %>% 
              reduce(`+`) %>%
  bind_cols(df, sum_yes = .)
#   num_col_1 num_col_2 text_col_1 text_col_2 sum_yes
#1         1         4        yes        yes       2
#2         2         5         no        yes       1
#3         3         6         no       <NA>       0