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

如何在R中编写可复用函数实现数据框成对行除法生成新列

在R中实现成对行除法并生成新列的可复用函数

需求概述

现有一个包含A、B两列的data.frame,需要生成新的data.frame并添加X、Y两列:

  • X列:取A列中成对行的除法结果(第1行÷第2行、第3行÷第4行……),将结果填入对应偶数行,奇数行留空
  • Y列:基于B列按相同规则完成成对行除法计算

以下是实现方案,附带示例数据与验证步骤。

示例数据

df <- structure(
  list(
    A = c(2L, 7L, 5L, 11L, 54L, 12L, 34L, 14L, 10L, 6L),
    B = c(3L, 5L, 1L, 21L, 67L, 32L, 19L, 24L, 44L, 37L)
  ),
  class = "data.frame",
  row.names = c(NA, -10L)
)

可复用函数实现

pair_divide <- function(df) {
  # 按每2行一组生成分组标识
  groups <- ceiling(seq_len(nrow(df)) / 2)
  
  # 计算X列:每组A列第1行除以第2行,结果放入偶数行
  x_results <- tapply(df$A, groups, function(x) {
    if (length(x) == 2) x[1] / x[2] else NA
  })
  df$X <- ""
  df$X[seq(2, nrow(df), 2)] <- as.character(x_results)
  
  # 计算Y列:同X列规则,基于B列计算
  y_results <- tapply(df$B, groups, function(x) {
    if (length(x) == 2) x[1] / x[2] else NA
  })
  df$Y <- ""
  df$Y[seq(2, nrow(df), 2)] <- as.character(y_results)
  
  # 将小数点替换为逗号(匹配期望输出格式)
  df$X <- gsub("\\.", ",", df$X)
  df$Y <- gsub("\\.", ",", df$Y)
  
  return(df)
}

调用与验证

运行函数获取结果:

result <- pair_divide(df)

对比期望输出:

expected <- structure(
  list(
    A = c(2L, 7L, 5L, 11L, 54L, 12L, 34L, 14L, 10L, 6L),
    B = c(3L, 5L, 1L, 21L, 67L, 32L, 19L, 24L, 44L, 37L),
    X = c("", "0,285714286", "", "0,454545455", "", "4,5", "", "2,428571429", "", "1,666666667"),
    Y = c("", "0,6", "", "0,047619048", "", "2,09375", "", "0,791666667", "", "1,189189189")
  ),
  class = "data.frame",
  row.names = c(NA, -10L)
)

# 验证结果一致性
all.equal(result, expected)

运行all.equal会返回TRUE,说明函数输出与期望结果完全匹配。

内容的提问来源于stack exchange,提问作者user19416206

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:48:21