Переназначение меток с помощью dplyr

#r #dplyr

#r #dplyr

Вопрос:

Каждый ID записывает серию меток сигнала: "alpha" , "beta" и "unknown" . Если идентификатор имеет только две метки. Затем я хочу назначить доминирующую метку всем , т. Е., если записанные метки идентификатора есть c("alpha", "alpha", "unknown") , они становятся c("alpha", "alpha", "alpha")

Может кто-нибудь, пожалуйста, помочь мне с этим.

 library(tidyverse)  # Data preparation (you can directly work with the tbl below) ID lt;- c(rep("A", 14), rep("B", 14), rep("C", 10), rep("D", 22), rep("E", 2)) series lt;- c(11, 3, 12, 2, 8, 2, 11, 8, 3, 2)  label lt;- unlist(  sapply(series, function(x) {case_when(x lt; 5 ~ rep("unknown", x),  x gt;= 5 ~ case_when(x gt; 10 ~ rep("alpha", x),  x lt;= 10 ~ rep("beta", x)) )  }))  # tbl tbl lt;- tibble(ID = ID,   label = label)   

Ответ №1:

Если я правильно понял, из этого

 tbl %gt;% group_by(ID) %gt;% summarise(n_distinct(label)) 1 A 2 2 B 2 3 C 2 4 D 3 5 E 1  

Мы хотим обновить метки для идентификаторов A B и C , но не D или E . Мы можем использовать функцию таблицы, чтобы получить наиболее часто встречающиеся в этих идентификаторах.

 tbl2 lt;- tbl %gt;%  group_by(ID) %gt;%  mutate(label = if(n_distinct(label) == 2) names(which.max(table(label))) else label)  

Что теперь дает количество различных меток на идентификатор

 tbl2 %gt;% group_by(ID) %gt;% summarise(n_distinct(label))  ID `n_distinct(label)`  lt;chrgt; lt;intgt; 1 A 1 2 B 1 3 C 1 4 D 3 5 E 1  

Комментарии:

1. Спасибо, что это правильно. Также есть способ сделать это только с помощью dplyr.

2. @SiH Я не думаю, что существует собственный способ dplyr создания таблиц частот и подмножеств на основе этого (хотя должен быть ). Возможным подходом , который используется только dplyr , может быть динамическое case_when или slice_max(1) , оба из которых не подходят для красивого кода (я пока не нашел ничего менее 5 дополнительных вызовов функций). nest_by(ID) в сочетании с a purrr::map может быть альтернативой.