R语言单个条件语句中执行多命令失效问题排查
问题原因
合并代码失效的核心是dplyr的函数不会修改原数据对象:
- 执行
z %>% mutate(id = ...)时,会生成一个包含id列的新数据框,但你没把这个新对象保存下来,后续的rownames<-操作仍然针对原始的z(没有id列),自然无法完成行名设置。 - 分开执行时,第一次lapply已经把带id列的新数据框存入data1,第二次操作的是已经更新后的对象,所以能正常运行。
修正后的代码
方式1:用管道链串联操作
把mutate和行名设置通过管道连起来,直接返回最终处理后的对象:
data1 <- lapply(data, function(y) { lapply(y, function(z) { if(all(c("variable", "missing") %in% names(z))) { z %>% mutate(id = paste0(variable, "_", row_number())) %>% `rownames<-`(.$id) } else z }) })
方式2:分步赋值保存中间结果
如果不习惯管道,也可以把mutate的结果先存到临时变量,再设置行名:
data1 <- lapply(data, function(y) { lapply(y, function(z) { if(all(c("variable", "missing") %in% names(z))) { z_with_id <- z %>% mutate(id = paste0(variable, "_", row_number())) `rownames<-`(z_with_id, z_with_id[["id"]]) } else z }) })
额外优化提示
- 可以把
paste0(z[["variable"]], sep= "_", row_number())简化成paste0(variable, "_", row_number()),因为在dplyr的mutate里可以直接引用列名。 - 如果后续不需要保留id列,还可以在管道最后加上
select(-id)去掉该列。
内容的提问来源于stack exchange,提问作者Rara
相关产品推荐
相关产品推荐

