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

如何在R语言中将数据框内不在18-35区间的值替换为NA?

解决R语言数据框中替换指定范围外值为NA的问题

先回顾原始数据生成代码:

Age_group_1<-c(18,18,18,21,21,21,30,36,36,42,42)
Age_group_2<-c(15,15,17,19,19,21,25,25,25,33,33)
Age_group_3<-c(12,12,13,13,22,22,25,25,27,27,30)
Age_group_4<-c(8,10,15,15,25,25,28,28,30,30,30)

Mydata<-data.frame(Age_group_1,Age_group_2,Age_group_3,Age_group_4)

你需要将数据框中所有小于18或大于35的值替换为NA,但你尝试的subset+na.omit组合无法实现目标——因为subset()是用来筛选符合条件的行,而非修改单元格值;na.omit()是删除含NA的行,这和你要保留所有行、仅替换特定值的需求完全不符。

解决方案1:基础R实现

直接对数据框进行逻辑索引替换,代码简洁高效:

# 复制原数据框,避免修改原始数据
New_data <- Mydata
# 将满足"小于18或大于35"的单元格替换为NA
New_data[New_data < 18 | New_data > 35] <- NA

运行后得到的New_data与你预期的结果一致:

Age_group_1 Age_group_2 Age_group_3 Age_group_4
1           18          NA          NA          NA
2           18          NA          NA          NA
3           18          NA          NA          NA
4           21          19          NA          NA
5           21          19          22          25
6           21          21          22          25
7           30          25          25          28
8           NA          25          25          28
9           NA          25          27          30
10          NA          33          27          30
11          NA          33          30          30

解决方案2:tidyverse/dplyr实现

如果你习惯使用tidyverse生态,可用dplyr的across()函数批量处理所有列:

library(dplyr)
New_data <- Mydata %>%
  mutate(across(everything(), ~ifelse(.x < 18 | .x > 35, NA, .x)))

该方法逻辑与基础R一致,管道语法让代码更易读,适合复杂数据操作场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:27:04