#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)
в сочетании с apurrr::map
может быть альтернативой.