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

求可按指定条件生成新数据框的R函数及正确实现方法

问题:按指定规则处理DataFrame生成新数据框

需求如下:

  • 保留所有**<=600**的值;
  • 保留每行中最后一个“保留值”的下一个值(即使该值不满足<=600);
  • 其余不满足条件的值设为NA。

输入示例

1.  2.  3.   4.    5.    6.
A1. 60. 87. 98.  156.  289.  601
A2. 80. 97. 201. 325.  701.  800
A3. 95. 98. 324. 567.  650.  901 

输出示例

1.  2.  3.   4.    5.    6.
A1. 60. 87. 98.  156.  289.  601
A2. 80. 97. 201. 325.  701.  NA
A3. 95. 98. 324. 567.  650.  NA

现有代码(基于dplyr)

library(dplyr)

newdata <- orginaldata |> mutate(across(everything(), \(x)
            if_else(between(x,0,601),x,NA)))

现有代码仅保留了<=601的值,无法满足“保留最后一个保留值的下一个值”的要求,询问如何修改代码或是否有合适的R函数实现需求。


解决方案

可以结合dplyr和purrr工具包逐行处理数据,核心逻辑是先定位每行中最后一个符合<=600条件的位置,再保留该位置及之前的所有值,同时保留其下一个位置的值,其余值设为NA。

修改后的代码(带辅助列,逻辑清晰)

library(dplyr)
library(purrr)

# 假设原始数据框名为orginaldata
newdata <- orginaldata |>
  rowwise() |>
  mutate(
    # 找出当前行中所有<=600的值的列索引
    keep_pos = list(which(c_across(everything()) <= 600)),
    # 确定需要保留的列:所有符合条件的列 + 最后一个符合条件列的下一列(不超过总列数)
    retain_pos = list(
      if (length(keep_pos) > 0) {
        c(keep_pos, min(max(keep_pos) + 1, ncol(orginaldata)))
      } else {
        integer(0)
      }
    ),
    # 遍历每列,不在保留列表中的值设为NA
    across(everything(), \(x) {
      col_idx <- which(colnames(orginaldata) == cur_column())
      if (col_idx %in% retain_pos[[1]]) x else NA
    })
  ) |>
  # 删除中间生成的临时辅助列
  select(-keep_pos, -retain_pos) |>
  ungroup()

代码说明

  • rowwise():让代码逐行处理数据,保证每行的计算独立;
  • c_across(everything()):把当前行的所有数值打包成向量,方便定位符合条件的位置;
  • keep_pos:记录当前行中所有<=600的值所在的列位置;
  • retain_pos:扩展保留范围,除了所有符合条件的列,额外加入最后一个符合条件列的下一列(如果存在);
  • across(everything()):逐个检查每一列,不在保留列表中的值直接替换为NA;
  • 最后清理临时列,取消按行分组,恢复正常数据框格式。

简化实现(无辅助列)

如果不想生成临时辅助列,可以用pmap_dfr直接处理每行:

library(dplyr)
library(purrr)

newdata <- orginaldata |>
  mutate(
    across(everything(), ~ .x) |>
    pmap_dfr(function(...) {
      row_vals <- c(...)
      keep_pos <- which(row_vals <= 600)
      # 确定要保留的位置
      retain_pos <- if (length(keep_pos) > 0) {
        c(keep_pos, min(max(keep_pos) + 1, length(row_vals)))
      } else {
        integer(0)
      }
      # 非保留位置设为NA
      row_vals[-retain_pos] <- NA
      as.list(row_vals)
    })
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:07:09