如何在 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)))]))
})
我正在根据来自 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)))]))
})