Мои данные выглядят так:
Moves <- c(0, 1, 2, 3, 4, 5, 6)
Men <- c(0.5, 0.3, 0.1, NA, 0.05, 0.05, NA)
Women <- c(0.4, 0.5, NA, NA, NA, 0.05, 0.05)
df <- tibble(Moves, Men, Women)
Теперь я хотел бы агрегировать значения в строках, где количество ходов равно 3 или более в столбцах «Мужчины» и «Женщины». Итак, я хочу, чтобы данные выглядели так:
Moves Men Women
0 0.5 0.4
1 0.3 0.5
2 0.1 NA
≥3 0.1 0.1
У меня есть некоторые проблемы с тем, чтобы понять, как это сделать. Большинство сообщений о связанных проблемах посвящено тому, как агрегировать значения между столбцами, но здесь я хочу сделать это внутри столбцов на основе условия.
Мы можем использовать case_when
, чтобы изменить «Движения», которые больше или равны 3, на >=3
, использовать это как группирующую переменную и summarise
другие столбцы.
library(dplyr)
df %>%
group_by(Moves = factor(case_when( Moves >=3 ~ '>=3',
TRUE ~ as.character(Moves)), levels = c('0', '1', '2', '>=3'))) %>%
summarise(across(everything(), ~ if (all(is.na(.))) NA_real_
else sum(., na.rm = TRUE)), .groups = 'drop')
-выход
# A tibble: 4 x 3
# Moves Men Women
# <fct> <dbl> <dbl>
#1 0 0.5 0.4
#2 1 0.3 0.5
#3 2 0.1 NA
#4 >=3 0.1 0.1
Или используя fct_collapse
из forcats
library(forcats)
df %>%
group_by(Moves = fct_collapse(as.character(Moves),
`>=3` = as.character(Moves[Moves >=3]))) %>%
summarise(across(everything(), ~ if (all(is.na(.))) NA_real_
else sum(., na.rm = TRUE)), .groups = 'drop')