如何按多个条件过滤R数据帧?
在 R 编程语言中,数据框列可以受到约束,并产生更小的子集。但是,在应用条件时,仍会保持以下属性:
- 行被视为输入的子集。
- 子集中的行以与原始数据框相同的顺序出现。
- 列保持不变。
- 可根据条件减少组数。
- 在数据过滤期间保留数据框属性。
- 行号可能不会保留在最终输出中
通过使用逻辑运算符(如 AND (&) 、 OR (|))将数据框行组合起来,可以将它们置于多个条件下。返回 TRUE 的行保留在最终输出中。
方法一:使用索引方法和which()函数
R 中的任何数据框列都可以通过其名称 df$col-name 或使用其在数据框 df[col-index] 中的索引位置来引用。然后可以对该列的单元格值进行约束、逻辑或比较条件,然后可以获得数据框子集。这些条件应用于数据框的行索引,以便返回满足的行。也可以使用 R 中的 which() 方法组合多个条件。 R 中的 which()函数返回满足给定条件的值的位置。
Syntax: which( vec, arr.ind = F)
Parameter :
vec – The vector to be subjected to conditions
%in%运算符用于检查指定向量中的值。
句法:
val %in% vec
例子:
R
# declaring a data frame
data_frame = data.frame(col1 = c("b","b","d","e","d") ,
col2 = c(0,2,1,4,5),
col3= c(TRUE,FALSE,FALSE,TRUE, TRUE))
print ("Original dataframe")
print (data_frame)
# checking which values of col1 are
# equivalent to b or e or the col2
# value is greater than 4
data_frame_mod <- data_frame[which(data_frame$col1 %in% c("b","e")
| data_frame$col2 > 4),]
print ("Modified dataframe")
print (data_frame_mod)
R
# declaring a data frame
data_frame = data.frame(col1 = c("b","b","d","e","d") ,
col2 = c(0,2,1,4,5),
col3= c(TRUE,FALSE,FALSE,TRUE, TRUE))
print ("Original dataframe")
print (data_frame)
# checking which values of col1
# are equivalent to b or e
data_frame_mod <- data_frame[data_frame$col1 %in% c("b","e")
& data_frame$col2 > 4,]
print ("Modified dataframe")
print (data_frame_mod)
R
library ("dplyr")
# declaring a data frame
data_frame = data.frame(col1 = c("b","b","d","e","e") ,
col2 = c(0,2,1,4,5),
col3= c(TRUE,FALSE,FALSE,TRUE, TRUE))
print ("Original dataframe")
print (data_frame)
# checking which values of col1 are
# equivalent to b and col3 is not
# TRUE
data_frame_mod <- filter(
data_frame,col1 == "b" & col3!=TRUE)
print ("Modified dataframe")
print (data_frame_mod)
R
# declaring a data frame
data_frame = data.frame(col1 = c("b","b","d","e","d") ,
col2 = c(0,2,1,4,5),
col3= c(TRUE,FALSE,FALSE,TRUE, TRUE))
print ("Original dataframe")
print (data_frame)
# checking which values of col1 are
# equivalent to b or col2 value is
# greater than 4
data_frame_mod <- subset(data_frame, col1=="b" | col2 > 4)
print ("Modified dataframe")
print (data_frame_mod)
输出
[1] "Original dataframe"
col1 col2 col3
1 b 0 TRUE
2 b 2 FALSE
3 d 1 FALSE
4 e 4 TRUE
5 d 5 TRUE
[1] "Modified dataframe"
col1 col2 col3
1 b 0 TRUE
2 b 2 FALSE
4 e 4 TRUE
5 d 5 TRUE
条件可以聚合在一起,也可以不使用哪种方法。
例子:
电阻
# declaring a data frame
data_frame = data.frame(col1 = c("b","b","d","e","d") ,
col2 = c(0,2,1,4,5),
col3= c(TRUE,FALSE,FALSE,TRUE, TRUE))
print ("Original dataframe")
print (data_frame)
# checking which values of col1
# are equivalent to b or e
data_frame_mod <- data_frame[data_frame$col1 %in% c("b","e")
& data_frame$col2 > 4,]
print ("Modified dataframe")
print (data_frame_mod)
输出
[1] "Original dataframe"
col1 col2 col3
1 b 0 TRUE
2 b 2 FALSE
3 d 1 FALSE
4 e 4 TRUE
5 d 5 TRUE
[1] "Modified dataframe"
[1] col1 col2 col3
<0 rows> (or 0-length row.names)
方法二:使用dplyr包
dplyr 库可以安装并加载到用于执行数据操作的工作空间中。 filter()函数用于生成数据框的子集,保留满足指定条件的所有行。 R 中的 filter() 方法可以应用于分组和未分组的数据。表达式包括运算符(==,>,> =),逻辑运算符(&,|!,XOR()),运算符范围(()之间,邻近())以及NA值检查针对列值.子集数据帧必须保留在单独的变量中。
Syntax: filter(df , cond)
Parameter :
df – The data frame object
cond – The condition to filter the data upon
这种方法在应用上的不同之处在于它不保留数据框的原始行号。
例子:
电阻
library ("dplyr")
# declaring a data frame
data_frame = data.frame(col1 = c("b","b","d","e","e") ,
col2 = c(0,2,1,4,5),
col3= c(TRUE,FALSE,FALSE,TRUE, TRUE))
print ("Original dataframe")
print (data_frame)
# checking which values of col1 are
# equivalent to b and col3 is not
# TRUE
data_frame_mod <- filter(
data_frame,col1 == "b" & col3!=TRUE)
print ("Modified dataframe")
print (data_frame_mod)
输出
[1] "Original dataframe"
col1 col2 col3
1 b 0 TRUE
2 b 2 FALSE
3 d 1 FALSE
4 e 4 TRUE
5 d 5 TRUE
[1] "Modified dataframe"
col1 col2 col3
1 b 2 FALSE
方法 3:使用子集方法
基 R 中的 subset() 方法用于返回满足应用条件的向量、矩阵或数据帧的子集。 subset() 方法与行有关。应用此方法时保留行号。
Syntax: subset(df , cond)
Arguments :
df – The data frame object
cond – The condition to filter the data upon
例子:
电阻
# declaring a data frame
data_frame = data.frame(col1 = c("b","b","d","e","d") ,
col2 = c(0,2,1,4,5),
col3= c(TRUE,FALSE,FALSE,TRUE, TRUE))
print ("Original dataframe")
print (data_frame)
# checking which values of col1 are
# equivalent to b or col2 value is
# greater than 4
data_frame_mod <- subset(data_frame, col1=="b" | col2 > 4)
print ("Modified dataframe")
print (data_frame_mod)
输出
[1] "Original dataframe"
col1 col2 col3
1 b 0 TRUE
2 b 2 FALSE
3 d 1 FALSE
4 e 4 TRUE
5 d 5 TRUE
[1] "Modified dataframe"
col1 col2 col3
1 b 0 TRUE
2 b 2 FALSE
5 d 5 TRUE