R语言实现两个dataframe整型列加1相除及求列均值的方法问询
以下提供两种不需要硬编码列位置的实现方案,完全匹配你的需求:
前置示例数据赋值
可直接运行复现你的场景:
df <- structure(list(name = c("arun", "jj", "jimmy"), data1 = c("no", "yes", "no"), data3 = c("yes", "yes", "no"), score1 = c(0, 40, 10), score2 = c(20, 30, 10)), class = "data.frame", row.names = c(NA, -3L)) df2 <- structure(list(name = c("arun", "jj", "jimmy"), data1 = c("no", "yes", "no"), data3 = c("yes", "yes", "no"), score1 = c(0, 20, 5), score2 = c(10, 30, 10)), class = "data.frame", row.names = c(NA, -3L))
方案1:base R实现(无需额外安装包)
自动识别数值列,不管非数值列的数量和排列顺序怎么变,代码都不需要调整:
# 1. 自动识别数值列,不需要手动指定列位置 num_cols <- sapply(df, is.numeric) # 2. 提取共有非数值列(两个表的非数值列完全一致,直接取df的即可) non_num_df <- df[, !num_cols, drop = FALSE] # 3. 执行计算:对应数值列各自加1后相除,保留2位小数 calc_res <- round((df[, num_cols] + 1) / (df2[, num_cols] + 1), 2) # 4. 合并非数值列和计算结果 df3 <- cbind(non_num_df, calc_res) # 5. 追加均值行 mean_row <- data.frame( name = "mean", data1 = "", data3 = "", t(round(colMeans(calc_res), 2)) ) df3 <- rbind(df3, mean_row)
方案2:tidyverse实现(更灵活易维护)
用across语法自动匹配列类型,适配性更强:
library(dplyr) df3 <- df %>% # 保留非数值列,对所有数值列执行对应计算 mutate(across(where(is.numeric), ~round((.x + 1)/(df2[[cur_column()]] + 1), 2))) %>% # 追加均值行 bind_rows(summarise(., name = "mean", data1 = "", data3 = "", across(where(is.numeric), ~round(mean(.x), 2))))
两种方案输出的df3和你期望的结构完全一致,都避免了硬编码列索引的问题,后续你新增/减少列也不需要修改核心逻辑。
内容的提问来源于stack exchange,提问作者Shrilaxmi M S
相关产品推荐
相关产品推荐

