Вот как бы я занялся этим:
groups <- df %>%
mutate(grp = str_extract(name, '.*(?=_confidence|_importance|_answer|_mc|_number|_slider)'),
sfx = str_extract(name, '(_confidence|_importance|_answer|_mc|_number|_slider)')) %>%
group_by(grp) %>%
summarize(confidence = '_confidence' %in% sfx,
importance = '_importance' %in% sfx,
answer = '_answer' %in% sfx,
mc = '_mc' %in% sfx,
number = '_number' %in% sfx,
slider = '_slider' %in% sfx) %>%
ungroup() %>%
gather(sfx, contains, -grp) %>%
filter(contains == TRUE) %>%
select(-contains)
df %>%
mutate(grp = str_extract(name, '.*(?=_confidence|_importance|_answer|_mc|_number|_slider)')) %>%
anti_join(groups %>%
filter(sfx == 'number') %>%
select(grp))
На высоком уровне я создаю промежуточный кадр данных, который содержит основание и суффикс строки name
, и использую основание для созданиягруппу, и определение того, какой из заданного вами списка суффиксов включен в каждую группу основ.Затем вместо filter
в исходном фрейме данных мы используем filter
в промежуточном фрейме данных, а затем anti_join
в исходном фрейме данных.
Давайте рассмотрим его чуть подробнеедеталь:
mutate(grp = str_extract(name, '.*(?=_confidence|_importance|_answer|_mc|_number|_slider)'),
sfx = str_extract(name, '(_confidence|_importance|_answer|_mc|_number|_slider)'))
Эта часть - то, как мы разбиваем столбец name
на его составные части - с помощью регулярных выражений.
group_by(grp) %>%
summarize(confidence = '_confidence' %in% sfx,
importance = '_importance' %in% sfx,
answer = '_answer' %in% sfx,
mc = '_mc' %in% sfx,
number = '_number' %in% sfx,
slider = '_slider' %in% sfx) %>%
ungroup()
Здесь мы группируем по "основам"", который я назвал grp
, а затем ищу каждый суффикс.Эта часть немного сложна, и ее нужно будет расширить, если в ваших данных будет больше групп.
gather(sfx, contains, -grp) %>%
filter(contains == TRUE) %>%
select(-contains)
Здесь мы преобразуем данные в фрейм данных «длинного» стиля и сохраняем толькосуффиксы, которые фактически содержатся в каждой группе.
Это завершает промежуточный фрейм данных.
df %>%
mutate(grp = str_extract(name, '.*(?=_confidence|_importance|_answer|_mc|_number|_slider)'))
Сначала мы должны создать столбец grp
в исходном фрейме данных, чтобы получитьanti_join
на работу.
anti_join(groups %>%
filter(sfx == 'number') %>%
select(grp))
И, наконец, мы anti_join
выводим отфильтрованную версию промежуточного фрейма данных в исходный фрейм данных.Я думаю, это даст желаемый эффект.
Надеюсь, это поможет!