如何对数据框中含偶数后缀的列重编码并添加分类均值列?
问题解决:数据框偶数后缀列重编码与均值计算
需求说明
对数据框中后缀为偶数的列(如N2、N4、N6、E2等)应用abs(x-6)函数重编码(自定义函数recode_items已实现),之后添加两列分别计算每行中N类列(N1-N6)、E类列(E1-E6)的均值。
示例数据与自定义函数
# 示例数据框 df1 <- tibble(id = 1:5, N1 = c(4,3,2,5,4), N2 = c(1,1,3,2,5), N3 = c(5,5,2,4,3), N4 = c(4,2,2,2,1), N5 = c(1,1,4,2,3), N6 = c(5,2,4,3,1), E1 = c(1,2,3,1,1), E2 = c(5,2,3,1,1), E3 = c(2,2,1,3,1), E4 = c(1,1,1,3,2), E5 = c(2,3,1,4,4), E6 = c(3,2,3,3,1)) # 自定义重编码函数 recode_items <- function(reverse_items) { items <- abs(reverse_items - 6) return(items) }
错误代码分析
原代码存在两处核心问题:
group_by(ends_with(c("2","4","6")))用法错误:group_by是用于按行分组统计的工具,不能用来选择列进行修改,这会导致分组逻辑完全偏离需求。mutate(N = mean(N1:N6), E = mean(E1:E6))计算的是整列均值,而非每行的均值,最终所有行的N、E值会完全相同,不符合需求。
正确代码实现
使用dplyr的across函数精准选择目标列并应用重编码,再用rowMeans计算每行的均值:
library(dplyr) recoded_df1 <- df1 %>% # 对后缀为2、4、6的列应用重编码函数 mutate(across(ends_with(c("2", "4", "6")), recode_items)) %>% # 计算每行N类列的均值 mutate(N_mean = rowMeans(select(., starts_with("N")), na.rm = TRUE), # 计算每行E类列的均值 E_mean = rowMeans(select(., starts_with("E")), na.rm = TRUE))
代码说明
across(ends_with(c("2", "4", "6")), recode_items):精准匹配所有后缀为2、4、6的列,对每列批量应用recode_items函数完成重编码。rowMeans(select(., starts_with("N")), na.rm = TRUE):先筛选所有以N开头的列,再计算每行的均值,na.rm = TRUE用于处理可能存在的缺失值。
运行后即可得到正确的重编码结果,以及每行对应的N类、E类列均值。
内容的提问来源于stack exchange,提问作者aesm315
相关产品推荐
相关产品推荐

