📜  如何按多个条件过滤R数据帧?

📅  最后修改于: 2022-05-13 01:54:29.289000             🧑  作者: Mango

如何按多个条件过滤R数据帧?

在 R 编程语言中,数据框列可以受到约束,并产生更小的子集。但是,在应用条件时,仍会保持以下属性:

  • 行被视为输入的子集。
  • 子集中的行以与原始数据框相同的顺序出现。
  • 列保持不变。
  • 可根据条件减少组数。
  • 在数据过滤期间保留数据框属性。
  • 行号可能不会保留在最终输出中

通过使用逻辑运算符(如 AND (&) 、 OR (|))将数据框行组合起来,可以将它们置于多个条件下。返回 TRUE 的行保留在最终输出中。

方法一:使用索引方法和which()函数

R 中的任何数据框列都可以通过其名称 df$col-name 或使用其在数据框 df[col-index] 中的索引位置来引用。然后可以对该列的单元格值进行约束、逻辑或比较条件,然后可以获得数据框子集。这些条件应用于数据框的行索引,以便返回满足的行。也可以使用 R 中的 which() 方法组合多个条件。 R 中的 which()函数返回满足给定条件的值的位置。

%in%运算符用于检查指定向量中的值。

句法:

例子:

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值检查针对列值.子集数据帧必须保留在单独的变量中。

这种方法在应用上的不同之处在于它不保留数据框的原始行号。

例子:



电阻

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() 方法与行有关。应用此方法时保留行号。

例子:

电阻

# 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