试图转换因子值。获取NA或不正确的值

时间:2014-06-05 19:34:44

标签: r

我有一个数据框"棒球"一些大学棒球运动员的击球统计数据。我试图转换球员'大学一年级(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级别分配给有序的值列表,但显然,这不是它的工作原理。

感谢您的帮助。

2 个答案:

答案 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.)

另外,当您明确指定级别的顺序时,大多数绘图和汇总函数的输出顺序也将自动按顺序排列。