Найти столбец с наибольшим количеством совпадений в нескольких столбцах R

У меня есть данные, которые выглядят так:

   id   a   b   c
1 346 BBX BBX RRS
2 677 BBX TFT TFT
3 999 BBX CAT CAT

Что я хочу сделать: для каждой строки найти значение через a, b, c, которое имеет наибольшее количество совпадений. Таким образом, результат будет выглядеть так:

   id   y
1 346 BBX
2 677 TFT
3 999 CAT

Если есть случаи, когда нет столбца с большим количеством совпадений, чем у любого другого, мне безразлично, какое значение выбрано.

Какие-либо предложения?

Я также получил возможность преобразовать данные, как описано ниже, и создать переменную «n» для количества вхождений каждого x. Но не уверен, как «выбрать» x с наибольшим n для каждого идентификатора

   id  x   n
1 346 BBX  2
2 346 RRS  1
3 677 BBX  1
4 677 TFT  2
5 999 BBX  1
6 999 CAT  2

Вот некоторый код данных:

id <- c("346", "677", "999")
a <- rep ("BBX", 3)
b <- c("BBX", "TFT", "CAT")
c <- c("RRS", "TFT", "CAT")
x <- data.frame(id, a,b,c, stringsAsFactors=F)

или же

id <- c("346", "346", "677", "677", "999", "999")
x <- c("BBX", "RRS", "BBX", "TFT", "BBX", "CAT")
n <- c("2", "1", "1", "2", "1", "2")
bl <- data.frame(id, x, n)

СПАСИБО!

Всего 1 ответ


Если вы уже развернули его, вы можете использовать top_n, например так:

x %>% pivot_longer(-id) %>% group_by(id) %>%  
count(value) %>% arrange(id,-n) %>% 
filter(!duplicated(id))
# A tibble: 3 x 3
# Groups:   id [3]
  id    value     n
  <chr> <chr> <int>
1 346   BBX       2
2 677   TFT       2
3 999   CAT       2

Если у вас есть NA, например, вы можете попробовать отфильтровать их:

x[1,3:4]= NA
x %>% pivot_longer(-id) %>% 
group_by(id) %>% filter(!is.na(value)) %>% 
count(value) %>% arrange(id,-n) %>% 
filter(!duplicated(id))

Или в базе R вы можете применить функцию сортировки (таблица (..)) построчно:

most_freq = apply(x[,-1],1,function(i)names(sort(-table(i)))[1])
data.frame(id=x$id,most_freq)
   id most_freq
1 346       BBX
2 677       TFT
3 999       CAT

Есть идеи?

10000