factor()中的未指定级别

4
我正在使用R处理一个数据集,该数据集附带有一个代码簿,基本上告诉我不同水平的因子变量标签应该是什么。例如,通过代码簿,我可以看到在我的“性别”变量中,0代表“女性”,1代表“男性”。我正在使用这些信息来相应地为我的变量标记值。
然而,最近我发现,令我失望的是,代码簿不完整。例如,它告诉我一个变量的1代表“是”,2代表“否”,但没有告诉我7、8和9代表什么,而我可以在数据中看到。我想做的是将此变量标记如下(或类似):
data$variable <- factor(data$variable,
                        levels=c(1, 2, 7, 8, 9),
                        labels=c("Yes", "No", "7", "8", "9"))

基本上,我希望所有在代码书中未指定的级别都标记为它们自己。我的问题是,这个代码书缺少了很多这样的级别,我真的不想手动查看数据中所有未定义的值,以构建每个变量的上述代码。此外,如果我省略那些缺失的级别,R会自动将它们标记为“NA”,而我不想要这样。
总结:我正在尝试弄清楚如何使用factor(),使其将所有未指定的级别标记为它们自己,而不是标记为“NA”。
1个回答

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

太棒了,非常感谢!我甚至没有想到只是改变标签就可以了!现在我可以停止吃这些冰淇淋了! - RickyB

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