如何解决根据R中另一个变量的平均值重命名分类变量
我想根据另一个连续变量的值重命名一个分类变量。
set.seed(123)
temp <- data.frame(label = as.factor(c(rep(1,5),rep(2,5))),number = c(runif(5,min =5,max = 12),runif(5,min = 3,max = 8)) ) %>% tibble()
>temp
label number
<fct> <dbl>
1 1 7.01
2 1 10.5
3 1 7.86
4 1 11.2
5 1 11.6
6 2 3.23
7 2 5.64
8 2 7.46
9 2 5.76
10 2 5.28
temp_update <- temp %>% group_by(label) %>%
mutate(mean_numb = mean(number)) %>% arrange(mean_numb) %>%
mutate(mean_numb=as.factor(round(mean_numb,2)))
> temp_update
# A tibble: 10 x 3
# Groups: label [2]
label number mean_numb
<fct> <dbl> <fct>
1 2 3.23 5.47
2 2 5.64 5.47
3 2 7.46 5.47
4 2 5.76 5.47
5 2 5.28 5.47
6 1 7.01 9.63
7 1 10.5 9.63
8 1 7.86 9.63
9 1 11.2 9.63
10 1 11.6 9.63
在这个小例子中,由于组 2 的 mean(number)
小于组 1 的 mean(number)
,我想将 label == 1
重命名为 2,{{ 1}} 到 1。
这个例子只是我问题的一个小玩具,想象一下我可以有大量的标签。
非常感谢
解决方法
比我确定的可能的要长一点,但这应该会让你到达那里:
我们首先汇总数据以获取来自 mean(number)
的唯一值,然后使用 rank()
函数找出哪些值更大。
然后我们使用 full_join()
将这些信息与原始数据重新放在一起,并与 label
列合并。
temp_update <- temp %>%
group_by(label) %>%
summarise(mean_numb = mean(number)) %>%
mutate(rank = rank(mean_numb)) %>%
full_join(temp,by="label") %>%
arrange(rank)
您可以使用以下方法确保列的名称现在最终替换了原始的 label
列:
temp_update %>%
mutate(label = rank,rank = NULL)
,
对于每个 label
,根据其均值计算 mean
number
和 arrange
数据。然后,您可以根据平均值创建一个新的标签列 (new_label
),它只是行号。将此数据与原始数据连接以获取所有行。
library(dplyr)
temp %>%
group_by(label) %>%
summarise(mean_num = mean(number)) %>%
arrange(mean_num) %>%
mutate(new_label = row_number()) %>%
inner_join(temp,by = 'label')
# label mean_num new_label number
# <fct> <dbl> <int> <dbl>
# 1 2 5.47 1 3.23
# 2 2 5.47 1 5.64
# 3 2 5.47 1 7.46
# 4 2 5.47 1 5.76
# 5 2 5.47 1 5.28
# 6 1 9.63 2 7.01
# 7 1 9.63 2 10.5
# 8 1 9.63 2 7.86
# 9 1 9.63 2 11.2
#10 1 9.63 2 11.6
为了比较目的,我在最终输出中同时保留了 label
和 new_label
列。如果不再需要,您可以使用 label
删除 %>% select(-label)
列。
为了完整起见,这里是使用 data.table
和 frank
函数的相同方法(您可能需要调整平局的排名方法,具体取决于您希望如何使用同样的意思):
library(data.table)
setDT(temp)
setkey(temp[temp[,.(mean_numb=mean(number)),by=label][,new_label:=frank(mean_numb)],on="label"],new_label)[]
#> label number mean_numb new_label
#> 1: 2 3.227782 5.474131 1
#> 2: 2 5.640527 5.474131 1
#> 3: 2 7.462095 5.474131 1
#> 4: 2 5.757175 5.474131 1
#> 5: 2 5.283074 5.474131 1
#> 6: 1 7.013043 9.631682 2
#> 7: 1 10.518136 9.631682 2
#> 8: 1 7.862838 9.631682 2
#> 9: 1 11.181122 9.631682 2
#> 10: 1 11.583271 9.631682 2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。