我想使用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'
答案 0 :(得分:2)
我们可以使用mutate
并为每一行取“是”的总和。
library(dplyr)
df %>%
mutate(sum_yes = rowSums(.[text_cols] == "yes"))
灵感来自this答案。
或者我们可以将do
与rowwise
一起使用
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
或者没有do
和rowwise
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)
我们也可以将reduce
与map
一起使用
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