使用map函数处理向量修改数据框列值时出现'.x未找到'错误求助
问题:批量将tibble指定列的值替换为"Total"
原始数据
我有如下tibble数据框:
adsl <- structure(list(SUBGRPVAR1 = structure(c("F", "M", "M", "M", "F", "F"), label = "Sex"), SUBGRPVAR2 = structure(c("Y", "N", "Y", "N", "Y", "N"), label = "Completers of Week 8 Population Flag")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame")) # 输出如下: # A tibble: 6 × 2 # SUBGRPVAR1 SUBGRPVAR2 # <chr> <chr> #1 F Y #2 M N #3 M Y #4 M N #5 F Y #6 F N
期望结果
希望将其修改为:
# A tibble: 6 × 2 # SUBGRPVAR1 SUBGRPVAR2 # <chr> <chr> #1 Total Total #2 Total Total #3 Total Total #4 Total Total #5 Total Total #6 Total Total
尝试的代码及错误
我尝试用map函数配合向量subgrpvarc实现,但运行时出现**"object .x not found"**错误:
subgrpvarc <- c("SUBGRPVAR1", "SUBGRPVAR2") map(subgrpvarc, ~ adsl[[names(adsl)[match(.x, names(adsl))]]] <- 'Total')
问题原因与解决方法
错误原因
map的匿名函数中,直接对全局变量adsl赋值会因为环境隔离问题,导致.x无法被正确识别;names(adsl)[match(.x, names(adsl))]属于冗余代码——.x本身就是列名,不需要额外匹配。
正确实现方式
方式1:Base R 直接赋值(最简单高效)
subgrpvarc <- c("SUBGRPVAR1", "SUBGRPVAR2") adsl[subgrpvarc] <- "Total"
方式2:dplyr 管道式修改(推荐,符合tidyverse风格)
library(dplyr) adsl <- adsl %>% mutate(across(all_of(subgrpvarc), ~ "Total"))
方式3:purrr 正确用法(如果一定要用purrr)
用walk(而非map,因为我们需要执行赋值副作用,不需要返回结果),同时使用全局赋值符号:
library(purrr) subgrpvarc <- c("SUBGRPVAR1", "SUBGRPVAR2") walk(subgrpvarc, ~ adsl[[.x]] <<- "Total")
内容的提问来源于stack exchange,提问作者jkatam
相关产品推荐
相关产品推荐

