R语言 根据向量中的值从DataFrame中选择行
在这篇文章中,我们将讨论如何在R编程语言中根据向量中的值从DataFrame中选择行。
方法1:使用%in%操作符
R语言中的%in%操作符,用于识别一个元素是否属于一个向量或数据框架。它被用来对满足条件的元素进行选择。它取值并检查其在指定对象中是否存在。
语法
val %in% vec
它返回一个布尔值TRUE或FALSE,取决于该元素是否被找到。然后从DataFrame中访问相应的元素。这种方法创建了一个DataFrame的子集,而没有对现有的DataFrame做任何改变。任何特定的列可以使用df$colname进行访问,然后使用这个比较操作符与向量进行匹配。
例子
# declare a DataFrame
data_frame <- data.frame(col1 = c(1:7),col2 = LETTERS[1:7])
print ("Original DataFrame")
print (data_frame)
# declaring the vector
vec <- c('A','a','C')
# getting the subset DataFrame after
# checking values if belonging to vector
sub_df <- data_frame[data_frame$col2 %in% vec,]
print ("Resultant DataFrame")
print (sub_df)
输出
[1] "Original DataFrame"
col1 col2
1 1 A
2 2 B
3 3 C
4 4 D
5 5 E
6 6 F
7 7 G
[1] "Resultant DataFrame"
col1 col2
1 1 A
3 3 C
方法2:使用is.element运算符
is.element(x, y)与x %in% y相同,它返回一个布尔逻辑值,如果找到该值则返回TRUE,否则返回FALSE。
语法
is.element(val,vec)
rbind在这里被应用于结合两个子DataFrames,在第一种情况下,col2的值可以被检查是否存在于向量中,然后是col3的值。然后,这两个子数据框架都可以被合并。
例子
# declare a DataFrame
data_frame <- data.frame(
col1 = c(1:7),col2 = LETTERS[1:7],col3 = letters[1:7])
print ("Original DataFrame")
print (data_frame)
# declaring the vector
vec <- c('a','C','D')
# getting the subset DataFrame after checking
# values if belonging to vector of the
# corresponding columns
sub_df <- rbind(data_frame[is.element(data_framecol2, vec),],
data_frame[is.element(data_framecol3, vec),])
print ("Resultant DataFrame")
print (sub_df)
输出
[1] "Original DataFrame"
col1 col2 col3
1 1 A a
2 2 B b
3 3 C c
4 4 D d
5 5 E e
6 6 F f
7 7 G g
[1] "Resultant DataFrame"
col1 col2 col3
3 3 C c
4 4 D d
1 1 A a
方法3:使用data.table包
R中的data.table包可以作为DataFrames的增强版被明确地调用到R工作空间中。R中的setDT()方法被用来通过引用将DataFrame转换为数据表。
语法: setDT(df, keep.rownames=FALSE, key=NULL, check.names=FALSE)
参数
- df – 数据框架
- key – 列名或任何必须传递给setkeyv的向量。
另外,函数J(vec)随后被应用,它通过将其映射到setDT()方法的key参数中传递的列索引来返回vec元素。它被用来创建相关表与字符向量的连接。
在使用这种方法时,注意到以下关键点。
- 数据框架被转换为一个数据表,因此,表中的每个结果行都由一个行号标识符引导,后面是” :” 。
- 数据框架与矢量的每一个值进行核对,最终输出的数据框架的行是按照这个值打印的。
- 应用这种方法可能会导致实际可用的数据和获得的结果之间的不明确性。
例子
# declare a DataFrame
# different data type have been
# indicated for different cols
library("data.table")
data_frame <- data.frame(
col1 = c(6:9),
col2 = c(4.5,6.7,89.0,6.2),
col3 = factor(letters[1:4])
)
print("Original DataFrame")
print (data_frame)
# declaring the vector
vec <- c(4,6)
data_frame <- setDT(data_frame, key = "col1")[J(vec)]
print ("Modified Dataframe")
print (data_frame)
输出
[1] "Original DataFrame"
col1 col2 col3
1 6 4.5 a
2 7 6.7 b
3 8 89.0 c
4 9 6.2 d
[1] "Modified Dataframe"
col1 col2 col3
1: 4 NA <NA>
2: 6 4.5 a
方法4:使用dplyr包
dplyr包提供了各种模块和方法来模拟数据操作。dplyr包在基础R中是不可用的,需要在工作空间中加入它作为一个库来使用。在这个包中有一个filter()方法,用来产生原始DataFrame的一个子集,其中列保持不变,行则根据应用的约束条件进行过滤。对条件返回布尔值TRUE的行可以作为操作的结果。然而,像其他操作一样,如果filter()方法产生一个NA的结果,它将被视为等同于FALSE的布尔值,并因此从生成的DataFrame中删除。
语法: filter(df, FUN)
参数:
- df – 一个DataFrame。
- FUN – 使用df变量定义的函数,在评估时返回一个布尔值
。
该方法与%in%操作符结合使用,选择满足指定条件的行。
例子
# declare a DataFrame
# different data type have
# been indicated for different
# cols
library(dplyr)
data_frame <- data.frame(
"col1" = as.character(6:9),
"col2" = c(4.5,6.7,89.0,6.2),
"col3" = factor(letters[1:4])
)
print("Original DataFrame")
print (data_frame)
# declaring the vector
vec <- (8:11)
data_frame <- filter(data_frame, col1 %in% vec)
print("Modified DataFrame")
print (data_frame)
输出
[1] "Original DataFrame"
col1 col2 col3
1 6 4.5 a
2 7 6.7 b
3 8 89.0 c
4 9 6.2 d
[1] "Modified Dataframe"
col1 col2 col3
1 8 89.0 c
2 9 6.2 d
极客教程