如何在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
相关产品推荐
相关产品推荐

