У меня есть такой набор данных:
structure(list(year = c(2019, 2019, 2019, 2019, 2019, 2019),
venue = c("Z", "Z", "Z", "Z", "O", "D"), HO = c("X", "Y",
"X", "Y", "W", "J"), AW = c("Y", "X", "W", "T", "T", "X")), row.names = c(NA,
-6L), class = c("tbl_df", "tbl", "data.frame"))
Мне нужно создать категориальную переменную, которая возвращает «да» или «нет».
structure(list(year = c(2019, 2019, 2019, 2019, 2019, 2019),
venue = c("Z", "Z", "Z", "Z", "O", "D"), HO = c("X", "Y",
"X", "Y", "W", "J"), AW = c("Y", "X", "W", "T", "T", "X"),
Cat = c("yes", "yes", "no", "no", "no", "no")), row.names = c(NA,
-6L), class = c("tbl_df", "tbl", "data.frame"))
Обратите внимание, что первые две строки соответствуют варианту «да». Они одинаковы в атрибутах «год» и «место проведения», независимо от порядка в «HO» и «AW».
Спасибо.
Вы можете сначала сгруппировать свой фрейм данных по строке, используя rowwise()
, затем paste
столбцы HO
и AW
вместе. Этот шаг состоит в том, чтобы увидеть, какие строки имеют одинаковые HO
и AW
независимо от порядка. Затем group_by
уникальная комбинация для их классификации.
library(dplyr)
library(stringr)
df %>%
rowwise() %>%
mutate(paste_col = paste0(sort(str_split(paste0(HO, AW), "", simplify = T)), collapse = ",")) %>%
group_by(year, venue, paste_col) %>%
mutate(Cat = ifelse(n() > 1, "Yes", "No")) %>%
ungroup() %>%
select(-paste_col)
# A tibble: 6 × 5
year venue HO AW Cat
<dbl> <chr> <chr> <chr> <chr>
1 2019 Z X Y Yes
2 2019 Z Y X Yes
3 2019 Z X W No
4 2019 Z Y T No
5 2019 O W T No
6 2019 D J X No
Это соответствует моему требованию.