我必须承认,处理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
,否则会搞乱了(除非你知道自己在做什么)。
一个小建议:避免使用与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
和letters
而不是来命名您,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
实际上需要同时改变水平和价值?嗯...我会挖出来的...