R语言如何为数据框隔行取值新增列并封装可复用函数
R实现隔行拆分列可复用方案
核心需求
- 输入为包含A、B两列的数据表
- 新增X列:仅保留A列奇数行(第1、3、5……位)的数值,其余位置填充
NA - 新增Y列:仅保留A列偶数行(第2、4、6……位)的数值,其余位置填充
NA - 逻辑封装为通用函数,替代原有Excel手动操作,可直接复用处理同类数据
示例输入数据
input_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))
期望输出结果
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(2L, NA, 5L, NA, 54L, NA, 34L, NA, 10L, NA), Y = c(NA, 7L, NA, 11L, NA, 12L, NA, 14L, NA, 6L)), class = "data.frame", row.names = c(NA, -10L))
实现函数
通过行号步长直接定位奇偶位置赋值,函数支持自定义源列名和生成的新列名,适配不同数据场景:
split_alternate <- function(df, source = "A", col_odd = "X", col_even = "Y") { # 复制原数据,避免直接修改输入对象 output <- df rcount <- nrow(output) # 填充奇数位置列 output[[col_odd]] <- NA odd_rows <- seq(1, rcount, by = 2) output[[col_odd]][odd_rows] <- output[[source]][odd_rows] # 填充偶数位置列 output[[col_even]] <- NA even_rows <- seq(2, rcount, by = 2) output[[col_even]][even_rows] <- output[[source]][even_rows] return(output) }
调用测试
# 传入示例数据运行 test_result <- split_alternate(input_df) # 打印结果验证 print(test_result)
运行后输出结果和预期完全匹配,处理任意行数的同类数据时直接传入对应数据框即可,无需修改内部逻辑。
内容的提问来源于stack exchange,提问作者user19435571
相关产品推荐
相关产品推荐

