You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:18:03