2017-02-07 52 views
1

这可能是超级平凡的,但我无法弄清楚。 我正在编写一个R脚本,用于清理/组织我的数据(仍在收集数据),以便一旦完成数据收集,我就会完成所有已写入的内容。 我遇到了因子变量的问题。种族/种族变量存储为数字:1 =白色,2 =黑色,3 =亚洲人,4 =西班牙裔,5 =其他。 眼下五大变化是这样的:指定因子变量

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

我想比赛变量转换成的因素,所以我尝试:

​​

但我得到的错误:

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")) 

它刚刚创建了一堆NAS。 如果我碰巧从6个种族中的每个种族的至少一个人收集数据,我上面发布的代码将工作。但是,这不会保证会发生。在收集数据之前编写脚本时,我应该如何处理这个问题?我想要它来处理所有可能的结果。 谢谢!

回答

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 

@国际海事组织的建议(更简洁):或者你可以同时使用水平与标签参数系数:

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

或者你可以有标签参数一起使用水平'factor':'race.f < - 因子(种族,等级= 1:6,标签= C(”白色“,”黑色“,”亚洲“,”hisp“,”本地“,”其他“))。 – lmo

+0

@lmo建议您单独作为答案。 – Gregor

+0

@Imo我已经添加了你的建议谢谢! –

0

race水平是整数,你需要定义人创建升标签时因素:

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