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

如何在R语言的DataFrame中筛选数据(附示例数据集)

在R语言的DataFrame中执行数据筛选操作

我来帮你梳理下在R语言的DataFrame里做数据筛选的几种常用方法,结合你给出的示例数据集来一步步演示:

第一步:构造示例数据集

首先我们把你提供的f1和f2数据转换成R的DataFrame:

# 定义f1和f2向量
f1 <- c(3,5,7,10,16,19,22,23,24,25,28,31,33,34,35,36,37,39,41,44,45,46,47,50,55,56,57,59,60)
f2 <- c("11/2/16 56.25","11/3/16 56.25","11/4/16 111.00","12/5/16 13.00","11/8/16 35.00",
        "11/9/16 415.21","11/10/16 280.00","12/10/16 817.00","10/11/16 830.00","11/11/16 644.00",
        "11/12/16 90.00","2/1/17 250.00","3/1/17 45.00","3/1/17 184.00","4/1/17 578.16",
        "4/1/17 160.00","5/1/17 21.00","6/1/17 352.00","6/1/17 2089.00","7/1/17 855.00",
        "8/1/17 488.00","8/1/17 573.00","8/1/17 654.00","9/1/17 1995.00","11/1/17 115.00",
        "11/1/17 2147.00","12/1/17 74.00","12/1/17 1431.00","1/1/18 100.00")

# 创建DataFrame
df <- data.frame(f1 = f1, f2 = f2, stringsAsFactors = FALSE)

可选:拆分f2列(方便基于日期/数值筛选)

因为你的f2列是日期和数值混合的字符串,我们可以把它拆分成单独的日期列和数值列,这样后续筛选更灵活:

# 加载tidyr包(如果没安装先运行 install.packages("tidyr"))
library(tidyr)
df <- separate(df, f2, into = c("date", "value"), sep = " ", convert = TRUE)

# 转换日期格式为标准Date类型
df$date <- as.Date(df$date, format = "%m/%d/%y")

常用筛选方法

1. 基础R方括号 [] 筛选

这是最原生的筛选方式,直接通过逻辑条件指定要保留的行:

  • 示例1:筛选f1大于30的所有行
df[df$f1 > 30, ]

解释:df$f1 > 30 会生成一个布尔向量,方括号的第一个位置是行筛选条件,第二个位置留空表示保留所有列。

  • 示例2:多条件联合筛选(f1在40-60之间,且数值大于500)
df[df$f1 >= 40 & df$f1 <= 60 & df$value > 500, ]

这里用 & 表示逻辑“与”,如果是逻辑“或”可以用 |。

2. 使用基础R的 subset() 函数

这个函数的语法更简洁,可读性更强,适合快速筛选:

  • 示例1:筛选f1小于20的行
subset(df, f1 < 20)
  • 示例2:筛选2017年的记录,且只保留f1和value列
subset(df, format(date, "%Y") == "2017", select = c(f1, value))

select 参数用来指定要保留的列,反之如果要排除列可以用 -列名。

3. 使用tidyverse的 dplyr::filter() 函数

这是目前R数据分析中非常流行的方法,语法直观,还支持链式操作,配合其他tidyverse工具效率很高:

首先加载dplyr包(未安装先运行 install.packages("dplyr")):

library(dplyr)
  • 示例1:筛选数值大于1000的行
df %>% filter(value > 1000)

%>% 是管道符,把左边的数据集传递给右边的函数处理。

  • 示例2:多条件筛选(f1为偶数,且日期是2016年11月)
# 需要lubridate包处理日期(未安装先运行 install.packages("lubridate"))
library(lubridate)

df %>% 
  filter(f1 %% 2 == 0,  # f1是偶数
         year(date) == 2016,  # 年份为2016
         month(date) == 11)  # 月份为11

多个条件用逗号分隔等价于逻辑“与”,如果要逻辑“或”可以用 |。

  • 示例3:链式操作(筛选后排序)
df %>% 
  filter(f1 > 50) %>%  # 先筛选f1大于50的行
  arrange(desc(value))  # 再按数值降序排列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:53:56