我有一个数据框"棒球"一些大学棒球运动员的击球统计数据。我试图转换球员'大学一年级(Fr.,So。,Jr。,Sr。)到数值(1,2,3,4)。我尝试了几种不同的方法,但我似乎无法做到这一点。
这就是我要开始的:
> baseball$Yr.
[1] Jr. Jr. So. Jr. Jr. Fr. Jr. Jr. So. Jr.
[11] Sr. Jr. Sr. So. Jr. Sr. So. Jr.
Levels: Fr. Jr. So. Sr.
1)首先,我尝试了这个:
> modBaseball = baseball
> levels(modBaseball$Yr.)
[1] "Fr." "Jr." "So." "Sr."
> levels(modBaseball$Yr.) = c(1,3,2,4)
> modBaseball$Yr.
[1] 3 3 2 3 3 1 3 3 2 3 4 3 4 2 3 4 2 3
Levels: 1 3 2 4
> class(modBaseball$Yr.)
[1] "factor"
" modBaseball $ YR&#34。是正确的,除了这个类仍然是一个因素,所以我这样做了:
> class(modBaseball$Yr.) = "integer"
> class(modBaseball$Yr.)
[1] "integer"
> modBaseball$Yr.
[1] 2 2 3 2 2 1 2 2 3 2 4 2 4 3 2 4 3 2
attr(,"levels")
[1] "1" "3" "2" "4"
现在,价值观发生了变化!我认为这是因为存储因子的方式以及我输入新级别的顺序。
2)所以,我再次尝试了,但这次我将水平设置为c(1,2,3,4)
。正如所料,这些值的分配不正确。
3)然后,我做了一些研究并尝试首先手动创建因子:
> modBaseball = baseball
> f = factor(modBaseball$Yr., levels=c(1,2,3,4), ordered=TRUE)
> f
[1] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[9] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[17] <NA> <NA>
Levels: 1 < 2 < 3 < 4
现在数据全部都是NA!我究竟做错了什么?我期望因子函数将1,2,3,4级别分配给有序的值列表,但显然,这不是它的工作原理。
感谢您的帮助。
答案 0 :(得分:1)
应该做的诀窍:
c(1,3,2,4)[baseball$Yr]
如果您了解有关R中因子的工作原理的更多信息,您会发现这些因素实际上只是整数与#34;字符&#34;标签。因此,当您看到"Fr.", "Sr."
时,R会将其视为1, 4
,并且只知道您希望1与Fr.等对应。
R自然地按字母顺序排序,这就是为什么它有Fr., Jr., So., Sr.
的顺序。所以Jr.实际上对应于2,所以。巧合的是,Sr和Fr恰好在正确的地方。
上面的代码行说明了向量1, 3, 2, 4
。由于R将Jr.
视为2,因此每次看到Jr.
(实际看到2)时,它将采用该向量的第2个元素,即3。
答案 1 :(得分:1)
您可以首先正确调整因子。
modBaseball$Yr. = factor(modBaseball$Yr., levels=c("Fr.","So.", "Jr.", "Sr.")).
那么常规的as.numeric()应该没问题
as.numeric(modBaseball$Yr.)
另外,当您明确指定级别的顺序时,大多数绘图和汇总函数的输出顺序也将自动按顺序排列。