为数据框中含Ranking的变量生成均值列时代码返回NA,求解决
问题原因与修正方案
出错原因
你的代码中,lapply对每个Ranking变量计算出的是单个均值数值,通过do.call(cbind,...)组合后得到的是1行多列的矩阵。而原数据集行数多于1,当把这个维度不匹配的矩阵赋值给新列时,R的维度匹配规则会导致新列被填充为NA。
修正代码
基础R版本
直接在lapply中将均值重复为与原数据集行数一致的向量,确保新列维度匹配:
# 获取名称含Ranking的变量列表 ranking_variables = names(data)[grepl("Ranking", names(data))] # 为每个变量生成对应均值列,重复均值至原数据行数 data[paste0(ranking_variables, "_mean")] <- lapply(data[ranking_variables], function(x) { rep(mean(x, na.rm = TRUE), nrow(data)) })
tidyverse版本(更简洁)
如果习惯使用dplyr,可以用across批量处理:
library(dplyr) data <- data %>% mutate(across(starts_with("Ranking"), ~mean(.x, na.rm = TRUE), .names = "{col}_mean"))
验证示例
用你给出的测试数据验证:
# 构造测试数据 data <- data.frame( Ranking_blah = c(1, -1, NA), Ranking_bleh = c(0, 1, 0.5) ) # 运行修正代码后,会得到期望的结果: # Ranking_blah_mean列全为0,Ranking_bleh_mean列全为0.5
内容的提问来源于stack exchange,提问作者kommoder_Waran
相关产品推荐
相关产品推荐

