Я хочу подсчитать количество экземпляров некоторой строки текста (или уровня фактора) в подмножестве столбцов с помощью 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'
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
На основе ответа это.
rowwise
с c_across
:df %>%
rowwise() %>%
mutate(sum_yes = sum(c_across(all_of(text_cols)) == "yes"))
do
с rowwise
df %>%
rowwise() %>%
do((.) %>% as.data.frame %>%
mutate(sum_yes = sum(.= = "yes")))
do
и rowwise
df %>%
select(text_cols) %>%
mutate(sum_yes = rowSums(. == "yes"))
df$sum_yes <- rowSums(df[text_cols] == "yes")
@RNs_Ghost вы можете выбрать столбцы по вашему выбору. Обновил ответ.
привет ребята, как я могу сделать то же самое, но заменить rowSums новейшим dplyr c_across? - Я не могу заставить его работать!
@JPV См. Второй пункт в моем обновленном ответе.
Мы также можем использовать 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
Я хочу работать только с подмножеством столбцов, не будет ли базовый ответ R работать со ВСЕМИ столбцами?