找回密码
 立即注册
查看: 4980|回复: 6

想把数据框某列数值(2:6)转换成因子,结果全部因子都是第1个数值(2)

[复制链接]
发表于 2016-12-4 16:56:24 | 显示全部楼层 |阅读模式
搞了一下午了,还没搞明白,求助:想把数据框某列数值(2:6)转换成因子,结果全部因子都是第1个数值(2)。



建立一个数据框:


> a<-data.frame(
+ x1=1:5,
+ x2=2:6,
+ x3=3:7,
+ y=5:9)
> a


  x1 x2 x3 y
1  1  2  3 5
2  2  3  4 6
3  3  4  5 7
4  4  5  6 8
5  5  6  7 9


把数据框的第2列(x2)转换成因子:


> a[,2]<-lapply(a[,2],as.factor)
Warning message:
In `[<-.data.frame`(`*tmp*`, , 2, value = list(1L, 1L, 1L, 1L, 1L)) :
  provided 5 variables to replace 1 variables


输出转换后的数据框,x2转换成了因子,但水平都是原x2的第一个值:
> a
  x1 x2 x3 y
1  1  2  3 5
2  2  2  4 6
3  3  2  5 7
4  4  2  6 8
5  5  2  7 9


有什么办法能把x2转换成因子2,3,4,5,6吗?


谢谢大家!
回复

使用道具 举报

发表于 2016-12-4 21:01:18 | 显示全部楼层
不错的东西奥!
回复

使用道具 举报

 楼主| 发表于 2016-12-4 22:24:01 | 显示全部楼层
尝试了用as.character转换:

> b<-a
> b[,2]<-as.character(b[,2])
> b
  x1 x2 x3 y
1  1  2  3 5
2  2  3  4 6
3  3  4  5 7
4  4  5  6 8
5  5  6  7 9
> str(b)
'data.frame':   5 obs. of  4 variables:
$ x1: int  1 2 3 4 5
$ x2: chr  "2" "3" "4" "5" ...
$ x3: int  3 4 5 6 7
$ y : int  5 6 7 8 9


转换成功了。
但很困惑用什么办法才能让lapply实现同样的效果,谢谢大家!

回复

使用道具 举报

发表于 2016-12-4 22:56:56 | 显示全部楼层
sapply(a$x2,as.factor)
回复

使用道具 举报

发表于 2016-12-4 23:05:25 | 显示全部楼层
或x<-lapply(a$x2,as.factor)%>%unlist,这样就复杂了。没必要这么装!
回复

使用道具 举报

发表于 2016-12-4 23:06:07 | 显示全部楼层
或x<-lapply(a$x2,as.factor)%>%unlist,这样就复杂了。没必要这么装!
回复

使用道具 举报

 楼主| 发表于 2016-12-5 23:03:49 | 显示全部楼层
angel226 发表于 2016-12-4 22:56
sapply(a$x2,as.factor)


按您的方法实现了,太感谢了!

> a$x2<-sapply(a$x2,as.factor)
> str(a)
'data.frame':   5 obs. of  4 variables:
$ x1: int  1 2 3 4 5
$ x2: Factor w/ 5 levels "2","3","4","5",..: 1 2 3 4 5
$ x3: int  3 4 5 6 7
$ y : int  5 6 7 8 9
> a
  x1 x2 x3 y
1  1  2  3 5
2  2  3  4 6
3  3  4  5 7
4  4  5  6 8
5  5  6  7 9

回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|R语言中文网

GMT+8, 2024-11-23 06:31 , Processed in 0.022023 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表