我必须承认,在 R 中处理因子是一项非常特殊的工作……在重新排序因子水平时,您并没有重新排序基础数值。这是一个小演示:
> numbers = 1:4
> letters = factor(letters[1:4])
> dtf <- data.frame(numbers, letters)
> dtf
numbers letters
1 1 a
2 2 b
3 3 c
4 4 d
> sapply(dtf, class)
numbers letters
"integer" "factor"
现在,如果您将此因子转换为数字,您将得到:
# return underlying numerical values
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
# change levels
1> levels(dtf$letters) <- letters[4:1]
1> dtf
numbers letters
1 1 d
2 2 c
3 3 b
4 4 a
# return numerical values once again
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
如您所见...通过更改级别,您仅更改级别(谁会告诉,嗯?),而不是数值!但是,当您factor
按照@Jonathan Chang 的建议使用函数时,会发生一些不同的事情:您自己更改数值。
您再次遇到错误,因为您这样做了levels
,然后尝试使用factor
. 不要这样做!不要使用,否则levels
你会把事情搞砸(除非你确切地知道你在做什么)。
一个 lil' 建议:避免使用与 R 对象相同的名称来命名您的对象(df
是 F 分布的密度函数,letters
给出小写字母)。在这种特殊情况下,您的代码不会有错误,但有时可能会……但这会造成混乱,我们不希望这样,不是吗?!?=)
相反,使用这样的东西(我将再次从头开始):
> dtf <- data.frame(f = 1:4, g = factor(letters[1:4]))
> dtf
f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 1 2 3 4
> dtf$g <- factor(dtf$g, levels = letters[4:1])
> dtf
f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 4 3 2 1
请注意,您也可以data.frame
用df
andletters
代替 来命名您g
,结果就可以了。实际上,此代码与您发布的代码相同,只是名称有所不同。这部分factor(dtf$letter, levels = letters[4:1])
不会引发错误,但它可能会令人困惑!
仔细阅读?factor
说明书!factor(g, levels = letters[4:1])
和有什么区别factor(g, labels = letters[4:1])
?levels(g) <- letters[4:1]
和有什么相似之处g <- factor(g, labels = letters[4:1])
?
您可以输入 ggplot 语法,以便我们在这方面为您提供更多帮助!
干杯!!!
编辑:
ggplot2
实际需要同时更改级别和值?嗯……我把这个挖出来……