Как переименовать значения по частоте в R - PullRequest
1 голос
/ 10 июля 2020

Я делаю несколько графиков на основе данных кластеризации из DAP C. Мне нужно, чтобы цвета были одинаковыми на всех графиках, и я хотел бы использовать определенные c цветов для самых больших групп. Важным моментом в этом вопросе является то, что я получаю набор данных из DAP C, например:

my_df <- data.frame(
  ID = c(1:10),
  Group = c("a", "b", "b", "c", "a", "b", "a", "b", "b", "c")
)

> my_df

ID  Group
1   a           
2   b           
3   b           
4   c           
5   a           
6   b           
7   a           
8   b           
9   b           
10  c

Я знаю, как найти группу с наибольшим количеством участников, например:

freqs <- table(my_df$Group)
freqs <- freqs[order(freqs, decreasing = TRUE)]

>freqs
b a c 
5 3 2 

Есть ли способ изменить значения в зависимости от их частоты? Каждый раз, когда я повторно запускаю DAP C, он меняет группы, поэтому я хотел бы написать код, который делает это автоматически, вместо того, чтобы переделывать его вручную. Вот как я бы хотел изменить фрейм данных:

> my_df                          > my_new_df
ID  Group                        ID  Group
1   a                             1  '2nd'
2   b                             2  '1st'          
3   b                             3  '1st'          
4   c                             4  '3rd'          
5   a                             5  '2nd'          
6   b                             6  '1st'          
7   a                             7  '2nd'          
8   b                             8  '1st'          
9   b                             9  '1st'          
10  c                             10 '3rd'          

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Вы можете использовать ave и создать из него factor с соответствующим labels=. Чтобы избежать жесткого кодирования, заранее определите метки в векторе lb.

lb <- c("1st", "2nd", "3rd", paste0(4:10, "th"))

with(my_df, factor(as.numeric(ave(as.character(Group), as.character(Group), FUN=table)),
       labels=rev(lb[1:length(unique(table(Group)))])))
#  [1] 2nd 1st 1st 3rd 2nd 1st 2nd 1st 1st 3rd
# Levels: 3rd 2nd 1st

Чтобы преобразовать больше таких столбцов, используйте sapply.

sapply(my_df[selected.columns], function(x) {
  factor(as.numeric(ave(as.character(x), as.character(x), FUN=table)),
         labels=rev(lb[1:length(unique(table(x)))]))
})
0 голосов
/ 10 июля 2020

Вы имеете в виду что-то вроде этого:

my_df %>% left_join(my_df %>% group_by(Group) %>% summarise(N=n())) %>%
  arrange(desc(N)) %>% select(-N)

   ID Group
1   2     B
2   3     B
3   6     B
4   8     B
5   9     B
6   1     A
7   5     A
8   7     A
9   4     C
10 10     C

Обновить

Это может пригодиться. Надеюсь, это поможет.

my_df %>% left_join(my_df %>% group_by(Group) %>% summarise(N=n()) %>% arrange(desc(N)) %>%
                      bind_cols(my_df %>% select(Group) %>% distinct() %>% rename(key=Group)) %>%
                      rename(NewGroup=Group,Group=key)) %>%
  select(-c(Group,N)) %>% rename(Group=NewGroup)

   ID Group
1   1     B
2   2     A
3   3     A
4   4     C
5   5     B
6   6     A
7   7     B
8   8     A
9   9     A
10 10     C
...