如何批量替换DataFrame每列最小值后的所有值为该最小值?
批量处理DataFrame列:替换最小值之后的所有值为最小值
问题场景
给定如下R数据框:
a <- c(1:6) b <- c(6, 1:5) c <- c(5:6, 1:4) d <- c(4:6, 1:3) e <- c(3:6, 1:2) f <- c(2:6, 1) df <- data.frame(a, b, c, d, e, f)
原始数据输出:
a b c d e f 1 1 2 3 4 5 6 2 6 1 2 3 4 5 3 5 6 1 2 3 4 4 4 5 6 1 2 3 5 3 4 5 6 1 2 6 2 3 4 5 6 1
需要将每列中第一个最小值出现位置及之后的所有值替换为该列的最小值,得到目标结果:
a b c d e f 1 1 2 3 4 5 6 2 1 1 2 3 4 5 3 1 1 1 2 3 4 4 1 1 1 1 2 3 5 1 1 1 1 1 2 6 1 1 1 1 1 1
批量处理方案
使用apply()函数对每列批量执行自定义逻辑,无需逐列手动处理:
df_processed <- as.data.frame(apply(df, 2, function(col) { # 获取当前列的最小值 min_val <- min(col) # 找到第一个最小值的位置 min_pos <- which.min(col) # 将最小值位置及之后的所有元素替换为最小值 col[min_pos:nrow(df)] <- min_val return(col) }))
代码解释
apply(df, 2, ...):第二个参数2指定按列遍历数据框,对每一列执行后续函数- 自定义函数中:
min_val <- min(col):提取当前列的最小值(通用逻辑,不局限于示例中的1)min_pos <- which.min(col):找到当前列中第一个最小值的索引位置col[min_pos:nrow(df)] <- min_val:将从最小值位置到最后一行的所有元素替换为最小值
as.data.frame():将apply()返回的矩阵转换回数据框格式
反向操作参考(最小值之前的所有值替换为最小值)
如果需要将每列中第一个最小值之前的所有值替换为最小值,只需修改替换的索引范围即可:
df_reverse <- as.data.frame(apply(df, 2, function(col) { min_val <- min(col) min_pos <- which.min(col) # 仅当最小值位置不是第一行时,替换前面的元素 if (min_pos > 1) { col[1:(min_pos - 1)] <- min_val } return(col) }))
内容的提问来源于stack exchange,提问作者Rosalin August
相关产品推荐
相关产品推荐

