【问题标题】:Trying to convert factor values. Getting NA's or incorrect values instead试图转换因子值。取而代之的是获取 NA 或不正确的值
【发布时间】:2014-06-06 03:59:32
【问题描述】:

我有一个数据框“棒球”,其中包含一些大学棒球运动员的击球数据。我正在尝试将球员的大学年份(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。”是正确的,除了类仍然是一个因素,所以我这样做了:

    > 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 分配给有序的值列表,但显然,它不是这样工作的。

感谢您的帮助。

【问题讨论】:

  • 你试过在任何地方使用as.numeric()吗?
  • 因子的水平总是字符值。
  • 从技术上讲,它们是的整数值。这是一个因素的重点。我建议阅读...尝试?factor! :-)

标签: r


【解决方案1】:

您首先可以正确地调整因素。

modBaseball$Yr. = factor(modBaseball$Yr., levels=c("Fr.","So.", "Jr.", "Sr.")). 

那么常规的 as.numeric() 应该就可以了

as.numeric(modBaseball$Yr.)

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

【讨论】:

  • 这成功了!由于关卡是自动添加的,我认为手动输入它们不会有什么不同。我想只要您手动输入的级别名称与您传递给函数的值完全匹配,它就会正确地重新分配级别编号。
【解决方案2】:

应该做的伎俩:

c(1,3,2,4)[baseball$Yr]

如果您详细了解因子在 R 中的工作原理,您会发现因子实际上只是带有“字符”标签的整数。因此,当您看到"Fr.", "Sr." 时,R 将其视为1, 4,并且只知道您希望 1 对应于 Fr.,等等。

R 自然地按字母顺序排序,这就是为什么它有Fr., Jr., So., Sr. 的顺序。所以 Jr. 实际上对应于 2 和 So。 to 3. Sr 和 Fr 正好在正确的位置。

上面的代码行说取向量1, 3, 2, 4。由于 R 将 Jr. 视为 2,因此每次看到 Jr.(实际上是 2)时,它将采用该向量的第二个元素,即 3。

【讨论】:

  • 当然,听起来他的目标只是获取数值。
  • 这个解决方案也很有效。不过,我不确定为什么。我需要调查一下。谢谢!
  • @user3712613 添加了解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多