2012-10-14 47 views
4

我正在使用R中的数据集,它附带一个代码簿,它基本上告诉我我的因子变量的不同级别的标签应该是什么。例如,通过密码本,我可以看到在我的“性别”变量中,0是“女性”,1是“男性”。我正在使用这些信息来相应地标记我的变量中的值。因子中的未指定级别()

但是,我最近发现,令我沮丧的是,代码簿不完整。例如,它告诉我有一个变量,1代表“是”,2代表“没有”,但没有告诉我7s,8s和9s是什么,我可以在数据中看到。我想这样做是标记这个变量如下(或像这样):

data$variable <- factor(data$variable, 
         levels=c(1, 2, 7, 8, 9), 
         labels=c("Yes", "No", "7", "8", "9")) 

基本上,我想为那些没有在指定的码书各级打成自己。我遇到的问题是这个代码簿丢失了很多这样的代码,我真的不必手动查看我的数据中所有未定义的值,以构建上面的代码以用于变量。另外,如果我忽略掉那些缺失的等级,R会自动将它们标记为“不适用”,这是我不想要的。我试图找出如何使用factor(),而不是将所有未指定的级别标记为“不适用”,而是将它们标记为它们自己。

回答

5

您可以在创建一个因子后转换级别,以便我们可以将其用于我们的优势。

mydat <- c(1, 2, 3,2,3,4,3,2,1,2,4,4,6,5,7,8,9) 
# convert to factor ignoring code book 
dat <- factor(mydat) 
# Create map corresponding to codebook levels 
mymap <- c("1" = "Yes", "2" = "No") 
# Figure out which levels are accounted for by codebook 
id <- levels(dat) %in% names(mymap) 
# Convert to appropriate values 
levels(dat)[id] <- mymap[levels(dat)[id]] 

或者(也许更容易一些)

# alternatively we can construct the map if we have two vectors 
# of the value and the codebook value 
val <- c(1, 2) 
lev <- c("Yes", "No") 

dat <- factor(mydat) 
levels(dat)[val] <- lev 
+0

这是真棒,非常感谢!我甚至没有想过只是改变标签!我现在可以停止吃这个冰淇淋了! – RickyB