楼主: lisle
4849 7

[问答] 因子变量(factor)如何调整某一值的因子排序(level)? [推广有奖]

  • 0关注
  • 0粉丝

本科生

24%

还不是VIP/贵宾

-

威望
0
论坛币
1 个
通用积分
1.5000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
561 点
帖子
33
精华
0
在线时间
122 小时
注册时间
2006-3-7
最后登录
2023-11-1

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
比如,2017年的人口数据集pop
    year population sex      age
1   2017      36468  男    0-4岁
2   2017      34344  男    5-9岁
3   2017      32929  男  10-14岁
4   2017      32034  男  15-19岁
5   2017      38496  男  20-24岁
6   2017      51451  男  25-29岁
7   2017      44709  男  30-34岁
8   2017      41944  男  35-39岁
9   2017      44730  男  40-44岁
10  2017      53661  男  45-49岁
11  2017      48982  男  50-54岁
12  2017      30244  男  55-59岁
13  2017      34027  男  60-64岁
14  2017      25281  男  65-69岁
15  2017      15790  男  70-74岁
16  2017      10774  男  75-79岁
17  2017       6660  男  80-84岁
18  2017       2758  男  85-89岁
19  2017        660  男  90-94岁
20  2017        131  男 95岁以上


其中,age变量是字符型,我需要把它转成因子型(factor)


因为因子的类别非常多,所以图省事,我直接转换

>  pop$age <- as.factor(pop$age)

> pop$age  

[1] 0-4岁    5-9岁    10-14岁  15-19岁  20-24岁  25-29岁  30-34岁  35-39岁  40-44岁  45-49岁  50-54岁  55-59岁  [13] 60-64岁  65-69岁  70-74岁  75-79岁  80-84岁  85-89岁  90-94岁  95岁以上

20 Levels: 0-4岁 10-14岁 15-19岁 20-24岁 25-29岁 30-34岁 35-39岁 40-44岁 45-49岁 5-9岁 50-54岁 55-59岁 ... 95岁以上


这里碰到的问题是,5-9岁的level是不对的。

请问,有没有函数可以方便地调整factor型变量中某一个值的level?比如本例中的5-9岁的。






二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:factor Level Facto Leve fact

回帖推荐

cheetahfly 发表于3楼  查看完整内容

levels(pop$age)
沙发
owenqi 在职认证  学生认证  发表于 2019-12-3 02:17:32 |只看作者 |坛友微信交流群
你这个实际上并不是只改变其中一个值的level吧,你这里现在5-9的是10,如果你把他变成2了,那相应后面的全部都要变的。
你可以试试这个方法。
  1. pop$age <- factor(pop$age, levels = as.character(pop$age))
复制代码
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

使用道具

藤椅
cheetahfly 在职认证  发表于 2019-12-3 12:30:22 |只看作者 |坛友微信交流群
levels(pop$age) <- levels(pop$age)[c(1, 10, 2:9, 11:length(levels(pop$age)))]

使用道具

板凳
lisle 发表于 2019-12-4 19:02:42 |只看作者 |坛友微信交流群
非常感谢。我解决这个问题的思路和你是一样的(如下)。
但是我处理的数据集其实包括多个年份。所以不能直接按你的方案来解决。


attach(pop)

先提取出age唯一值

age3 <- unique(age)

然后按原字符顺序转成因子变量

age4 <- factor(1:20, labels=age3)

最后,按age4的排序赋给数据集pop中的age变量

age <- factor(pop, levels=age4)

使用道具

报纸
lisle 发表于 2019-12-4 19:03:41 |只看作者 |坛友微信交流群
cheetahfly 发表于 2019-12-3 12:30
levels(pop$age)
谢谢,这正是我需要的!

使用道具

地板
lisle 发表于 2019-12-4 19:14:26 |只看作者 |坛友微信交流群
owenqi 发表于 2019-12-3 02:17
你这个实际上并不是只改变其中一个值的level吧,你这里现在5-9的是10,如果你把他变成2了,那相应后面的全部 ...
非常感谢。我解决这个问题的思路和你是一样的(如下)。
但是我处理的数据集其实包括多个年份。所以不能直接按你的方案来解决。


attach(pop)

先提取出age唯一值

age3 <- unique(age)

然后按原字符顺序转成因子变量

age4 <- factor(1:20, labels=age3)

最后,按age4的排序赋给数据集pop中的age变量

age <- factor(age, levels=age4)

-------------------
我真受不了这个论坛的发帖编辑。

使用道具

7
淘淘22 发表于 2021-10-15 08:52:52 |只看作者 |坛友微信交流群
lisle 发表于 2019-12-4 19:14
非常感谢。我解决这个问题的思路和你是一样的(如下)。
但是我处理的数据集其实包括多个年份。所以不能 ...
这样操作的话,导致因子顺序改变,后面数值却未跟着改变。

使用道具

8
淘淘22 发表于 2021-10-15 09:51:12 |只看作者 |坛友微信交流群
淘淘22 发表于 2021-10-15 08:52
这样操作的话,导致因子顺序改变,后面数值却未跟着改变。
跟楼主遇到了一样的问题,自己找到解决方法了
pops=pops %>%
  mutate(Age = factor(Age, levels = unique(pops$Age)))

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-11 09:07