如何在 R 中按频率重命名值

How to rename values by frequency in R

我正在根据来自 DAPC 的聚类数据制作几张图表。我需要所有图表的颜色都相同,并且我想为最大的组使用特定颜色。这个问题的重点是,我从 DAPC 得到了一个数据集,如下所示:

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 

有没有办法根据频率更改值?每次我重新运行 DAPC 时,它都会更改组,因此我想编写自动执行此操作的代码,而不必手动重做。这是我希望更改数据框的方式:

> 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'          

你的意思是这样的吗:

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

您可以使用 ave 并用相应的 labels= 创建一个 factor。为避免硬编码,请预先在向量 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)))]))
})