指定因子变量

时间:2017-02-07 20:06:21

标签: r

这可能是琐碎的,但我无法弄明白。 我正在编写一个R脚本来清理/组织我的数据(仍然在收集),这样一旦完成数据收集,我就会写完所有内容。 我遇到了因子变量的问题。种族/种族变量存储为数字:1 =白色,2 =黑色,3 =亚洲,4 =西班牙语,5 =其他。 现在五个观察结果如下:

race <- c(1, 1, 3, 5, 2)

我想将种族变量转换为因子,所以我尝试了:

race.f <- factor(race, labels = c("white", "black", "asian", "hisp",
"native", "other"))

但我收到错误:

Error in factor(race, labels = c("white", "black", "asian", "hisp", 
"native",  : invalid 'labels'; length 6 should be 1 or 4

我猜这是因为我说有6个标签,但在我的数据集中,只有6个可能结果中有4个被观察到。 我确信这可以通过levels参数解决,但我无法弄清楚何时/何地使用它。我试过了

race.f <- factor(race, levels = c("white", "black", "asian", "hisp", 
"native", "other")) 

它刚刚创建了一堆NA。 如果我碰巧收集了来自6个种族中每个人的至少一个人的数据,我上面发布的代码就可以了。但是,并不能保证会发生这种情况。在收集数据之前编写脚本时,我该如何处理?我希望它能够处理所有可能的结果。 谢谢!

2 个答案:

答案 0 :(得分:0)

您收到NA因为,race默认情况下不是factor并且在factor()内使用它,导致NA,因为它不是能够在race中找到指定的级别。因此,我们必须先将race中的值与相应的races

相匹配

为此,我们需要一个如下所示的查找向量:

vec <- c("white"=1, "black" = 2, "asian" = 3,"hispanic" = 4, "other" = 5)

set.seed(100)
race <- sample(1:5, 8, replace = T)
# [1] 2 2 3 1 3 3 5 2

race_new <- names(vec)[match(race, vec)] # match() returns the position where race matched with vec in vec
factor(race_new, levels = names(vec))
# [1] black black asian white asian asian other black
# Levels: white black asian hispanic other

@ Imo的建议(更简洁):或者您可以将这些级别与labels参数一起使用来计算因素:

race.f <- factor(race, levels=1:6, labels = c("white", "black", "asian",
                                              "hisp", "native", "other"))

答案 1 :(得分:0)

race级别是整数,您需要在创建因子时为所有标签定义:

race.f <- factor(race, 
                 levels = 1:6, # one for each label
                 labels = c("white", "black", "asian", 
                            "hisp", "native", "other"))