Я пытаюсь получить среднее () и сумму () для определенных столбцов в строках. Этот код создаст набор данных:
library(tidyverse)
test_data <- tibble(part_id = 1:5,
a_1 = c("a", "b", "c", "d", "a"),
a_2 = c("b", NA, "b", "a", "d"),
a_3 = c("b", "b", "d", "d", "a"))
test_data <- test_data %>%
mutate_at(vars(a_1, a_2), .funs = list(scored = ~case_when(
. == "a" | . == "b" ~ 1,
. == "c" ~ 0,
. == "d" ~ -100)))
Если я попытаюсь использовать rowSums () или rowMeans (), я получу правильный ответ:
library(tidyverse)
test_data <- test_data %>%
mutate(a_total = rowSums(dplyr::select(., contains("scored")), na.rm = TRUE),
a_mean = rowMeans(dplyr::select(., contains("scored")), na.rm = TRUE))
Но, если попытаться использовать rowwise () с последующим sum () или mean (), он не работает:
library(tidyverse)
test_data <- test_data %>%
rowwise() %>%
mutate(a_total = base::sum(dplyr::select(., contains("scored")), na.rm = TRUE),
a_mean = base::mean(dplyr::select(., contains("scored")), na.rm = TRUE)) %>%
ungroup()
Для sum () он дает общую сумму, эффективно игнорируя rowwise (), и для mean (), все ответы - NA, и я получаю это предупреждение для каждой строки:
Warning messages:
1: In mean.default(dplyr::select(., contains("scored")), na.rm = TRUE) :
argument is not numeric or logical: returning NA
Я также попробовал эту модификацию, включив функцию c (), как если бы вы перечисляли каждый столбец. Это привело к следующей ошибке:
library(tidyverse)
test_data <- test_data %>%
rowwise() %>%
mutate(a_total = base::sum(c(dplyr::select(., contains("scored"))), na.rm = TRUE),
a_mean = base::mean(c(dplyr::select(., contains("scored"))), na.rm = TRUE)) %>%
ungroup()
Error in base::sum(c(dplyr::select(., contains("scored"))), na.rm = TRUE) :
invalid 'type' (list) of argument
Как я могу заставить эту работу работать с rowwise ()? Почему это ведет себя не так, как обычно, и чем rowSums () или rowMeans ()?
Я ценю любую информацию!