防止因子水平的排序

4

当我在R中提取数据帧列的因子水平时,它们会自动排序(按字母顺序)。我该怎么防止这种情况发生?也就是说,我希望水平的顺序与数据框中列的顺序相同。

data.frame(Names = c("Paul McCartney", "John Lennon")) -> my.data
levels(my.data$Names)

[1] "约翰·列侬" "保罗·麦卡特尼"


为什么你需要这个?你是否在处理一个有序因子? - Roland
@Roland。既然你问了,我在我的数据框中有一列“X”,只有一些行有值。我想提取第一列(“Names”)中这些行的值。我使用“w = my.data [my.data $ X!=“NA”,]$ Names”,它返回这些值,但也有一堆“NA”。所以我想通过查看“levels(w)”来获取我感兴趣的值,但是它们的顺序不能从原始数据框中更改,因为我稍后要将这些值与原始数据框中的“X”列的值匹配。可能有更好的方法去做这件事... :-/ - Sverre
是的,有更好的方法。将该列设置为字符类型,并进行操作。 - Roland
@Roland。我现在尝试了那个方法,但最终结果还是一样的(即当我用“my.data [my.data $ X!=“NA”,]$ Names”提取我感兴趣的名称时,会得到一堆“NA”)... - Sverre
1
您可以使用函数is.na来检查是否存在NA值,例如:my.data[!is.na(my.data$X),"Names"] - Roland
2个回答

11

读取数据后重新分配因子:

x <- data.frame(x=letters[c(2,1,2)], y=1:3)
x$x
## [1] b a b
## Levels: a b
x$x <- factor(x$x, levels=unique(x$x))
x$x
## [1] b a b
## Levels: b a

我曾因这种方法在日期上失败而受挫:x <- Sys.Date();factor(x,unique(x))将返回带有正确级别的NA,为避免此情况,请使用factor(x, as.character(unique(x))),它不会改变字符/数字/逻辑的行为。 - moodymudskipper

2

如果你想防止因子的排序,你需要将因子水平明确地作为 levels 传递:

factor(c("Paul McCartney", "John Lennon"), levels = c("Paul McCartney", "John Lennon"))
## [1] Paul McCartney John Lennon   
## Levels: Paul McCartney John Lennon

在您的情况下,您应该在创建 data.frame 之前创建 factor 并将其粘贴到 data.frame 中:

f1 <- factor(c("Paul McCartney", "John Lennon"), levels = c("Paul McCartney", "John Lennon"))
my.data <- data.frame(Names = f1)
levels(my.data$Names)

## [1] "Paul McCartney" "John Lennon" 

问题在于,在我的实际情况下,我正在处理一个相当大的数据集,因此这并不是真正可行的... - Sverre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接