R语言中通过for循环返回因子列水平的代码问题求助
解决因子列水平提取的问题
你的代码存在几个小问题导致无法正常运行,我来一步步帮你修正:
问题分析
- 未初始化结果对象:
res没有提前定义就直接赋值,R不知道它是一个列表类型,会触发报错 - 循环内提前终止:
return(res)写在for循环内部,第一次循环就会直接退出程序,根本没机会遍历所有因子列 - 冗余的因子转换:
df[,i]本身已经是因子类型,不需要再用factor()包裹,直接调用levels()就能拿到水平值
修正后的代码
df <- structure(list(ColA = structure(c(19L, 3L, 12L, 21L), .Label = c("asgfg", "dds", "dfg", "dfh", "dgh", "dghgd", "dgrert", "dgsh", "dsgdfg", "dsgdg", "e", "er", "ewt", "fdg", "fdgd", "fg", "gdfgd", "gdfsh", "gf", "gfdg", "gfs", "gh", "ghj", "ghjhg", "gjgj", "gt", "hdsger", "hgdhg", "hgj", "hjghj", "jgh", "jyfj", "ret", "rth", "ryuy", "sdf", "sdfh", "sfdg", "sgdf", "tyew", "tyu", "tyutyu", "uiuy", "yoiy", "yt"), class = "factor"), ColB = structure(c(1L, 1L, 1L, 1L), .Label = c("A", "B"), class = "factor"), ColC = 1:4, ColD = 2:5), row.names = c(NA, 4L), class = "data.frame") # 获取所有因子列的名称 sa <- names(Filter(is.factor, df)) # 初始化空列表用于存储结果 res <- list() # 遍历每个因子列,提取对应水平 for (i in sa) { res[[i]] <- levels(df[, i]) } # 查看最终结果 res
运行这段代码后,你就能得到预期的输出:
$ColA [1] "dfg" "er" "gf" "gfs" $ColB [1] "A"
更简洁的替代写法(可选)
如果不想用for循环,用lapply可以一行搞定,效果完全一致:
res <- lapply(df[, sa], levels)
内容的提问来源于stack exchange,提问作者Dev P
相关产品推荐
相关产品推荐

