能否使用dplyr::mutate函数通过列索引修改列的值?
用列索引通过dplyr::mutate修改列值的实现方法
你可以通过以下几种方式实现用列索引替代列名,在mutate中修改列值:
方法1:使用across()函数
across()支持直接传入列位置作为参数,是dplyr推荐的动态处理列的方式:
df = data.frame(A=c(1,2), B=c(3,4)) df %>% group_by(A) %>% mutate(across(2, ~ .x + 1))
这里across(2, ~ .x + 1)表示对第2列执行“值加1”的操作。
方法2:动态生成列名符号
先通过列索引获取对应列名,再用!!sym()将列名转换为mutate可识别的符号,配合:=完成赋值:
df = data.frame(A=c(1,2), B=c(3,4)) target_col_idx = 2 target_col_name = colnames(df)[target_col_idx] df %>% group_by(A) %>% mutate(!!sym(target_col_name) := .[[target_col_idx]] + 1)
方法3:结合.data代词
利用dplyr的.data代词通过索引取值,再动态指定目标列:
df = data.frame(A=c(1,2), B=c(3,4)) target_col_idx = 2 df %>% group_by(A) %>% mutate(!!colnames(df)[target_col_idx] := .data[[target_col_idx]] + 1)
原代码报错原因
你最初的mutate(.[[2]] = .[[2]] + 1)写法不符合dplyr的非标准求值规则:mutate的左侧需要是列名(符号形式),而不能直接使用索引引用,因此必须将索引转换为对应的列名符号,或使用across这类支持位置参数的函数。
内容的提问来源于stack exchange,提问作者cxz2001
相关产品推荐
相关产品推荐

