繁体   English   中英

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

[英]Compute row-wise counts in subsets of columns in 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'
  1. 我们可以使用mutate并为每行计算“是”数量的总和。
library(dplyr)    
df %>%  mutate(sum_yes = rowSums(.[text_cols] == "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

灵感来自这个答案。

  1. rowwisec_across
df %>%
  rowwise() %>%
  mutate(sum_yes = sum(c_across(all_of(text_cols)) == "yes"))
  1. dorowwise
df %>%
  rowwise() %>%
  do((.) %>% as.data.frame %>% 
  mutate(sum_yes = sum(.=="yes")))
  1. 没有dorowwise
df %>%
 select(text_cols) %>%
 mutate(sum_yes = rowSums(. == "yes")) 
  1. 在基础R中,它实际上更简单
df$sum_yes <- rowSums(df[text_cols] == "yes")

我们也可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM