Я пытаюсь получить среднее значение () и сумму () для определенных столбцов по строкам. Этот код создаст набор данных:
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 ()?
Я ценю любую проницательность!
sum
иmean
- person Rohit   schedule 05.04.2020