如何在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
相关产品推荐
相关产品推荐

