📅  最后修改于: 2023-12-03 14:55:39.269000             🧑  作者: Mango
在 R 语言中,有时候我们需要根据一个向量中的值,从一个 DataFrame 中选择对应的行进行操作或者提取。这可以通过使用 R 数据框的一个基本函数 subset()
以及逻辑向量进行实现。
我们先来创建一个简单的 DataFrame,作为本文的示例数据:
df <- data.frame(
Name = c("Peter", "John", "Mary", "Lisa", "Tom"),
Age = c(22, 31, 30, 25, 29),
Gender = c("M", "M", "F", "F", "M"),
Strings = c("ABCA", "DEFG", "BBBB", "HIJK", "LMNO"),
stringsAsFactors = FALSE
)
其中,df
DataFrame 中包含了一些人的名称、年龄、性别和字符串这四列信息,如下所示:
> df
Name Age Gender Strings
1 Peter 22 M ABCA
2 John 31 M DEFG
3 Mary 30 F BBBB
4 Lisa 25 F HIJK
5 Tom 29 M LMNO
在 R 语言中,可以使用 subset()
函数,根据指定条件筛选 DataFrame 中的行。该函数有两个必须的参数 x
和 subset
,其中:
x
:是一个数据框;subset
:是一个逻辑条件表达式字符串,类似于 SQL 的 where
子句,只要符合条件的行都会被返回。下面是一个简单的示例,我们可以使用 subset()
函数,根据性别选择 DataFrame 中的行:
> subset(df, Gender == "M")
Name Age Gender Strings
1 Peter 22 M ABCA
2 John 31 M DEFG
5 Tom 29 M LMNO
从输出结果可以看出,subset()
函数返回了 Gender
列中值为 "M" 的行。
但是,如果我们要根据一个向量中的值进行条件筛选,该怎么做呢?接下来我们来看几种策略。
在 R 语言中,可以使用 %in%
运算符,判断一个向量中的值是否包含于另一个向量或一个 DataFrame 中。该运算符返回的结果是逻辑向量,向量中的值为 TRUE
表示对应的元素包含在指定对象中,为 FALSE
表示不包含。
接下来我们假设有一个名为 name
的向量,包含了一些人的名字,我们需要根据该向量中元素的值,从 df
DataFrame 中选择对应的行。我们可以使用 %in%
和 subset()
函数实现该功能,如下所示:
# 假设有一个名为 name 的向量,包含了一些人的名字
name <- c("Mary", "Tom")
# 筛选 df DataFrame 中名字在 name 向量中的行
df_sub <- subset(df, Name %in% name)
# 输出 df_sub DataFrame
> df_sub
Name Age Gender Strings
3 Mary 30 F BBBB
5 Tom 29 M LMNO
可以看出,df_sub
DataFrame 中只有名字为 "Mary" 和 "Tom" 的行被保留了下来。
在 R 语言中,可以使用 match()
函数,查找一个向量在另一个向量或一个 DataFrame 中的位置。该函数返回的结果也是一个向量,向量中包含了对应元素在目标对象中的位置。如果该元素不存在于目标对象中,则返回一个 NA
值。
下面的示例代码中,我们可以使用 match()
函数和 subset()
函数,筛选出在一个名为 idx
的向量中指定位置的行:
# 假设有一个名为 idx 的向量,包含了一些要选择的行的索引值
idx <- c(1, 4)
# 筛选 df DataFrame 中 idx 向量中指定位置的行
df_sub <- subset(df, match(1:nrow(df), idx, nomatch = 0) > 0)
# 输出 df_sub DataFrame
> df_sub
Name Age Gender Strings
1 Peter 22 M ABCA
4 Lisa 25 F HIJK
从输出结果可以看出,df_sub
DataFrame 中只有原 DataFrame 的第 1 行和第 4 行被保留了下来。
其中,match()
函数中的 nomatch = 0
表示当目标元素不存在于目标对象中时,返回 0 值,这与 subset()
函数中的逻辑条件要求匹配。
在 R 语言中,可以使用 which()
函数,查找一个向量中符合指定逻辑条件的元素位置。该函数返回的结果也是一个向量,向量中包含了符合逻辑条件的元素位置。如果不存在符合条件的元素,则返回一个长度为 0 的向量。
下面的示例代码中,我们可以使用 which()
函数和 subset()
函数,筛选出在一个名为 age
的向量中符合年龄大于 28 的条件的行:
# 假设有一个名为 age 的向量,包含了一些人的年龄
age <- c(22, 31, 30, 25, 29)
# 筛选 df DataFrame 中 age 向量中符合年龄大于 28 的行
df_sub <- subset(df, which(Age > 28))
# 输出 df_sub DataFrame
> df_sub
Name Age Gender Strings
2 John 31 M DEFG
3 Mary 30 F BBBB
5 Tom 29 M LMNO
从输出结果可以看出,df_sub
DataFrame 中只有年龄大于 28 的行被保留了下来。
在本文中,我们介绍了如何根据 R 中向量中的值从 DataFrame 中选择行。我们使用了 R 数据框的一个基本函数 subset()
以及 R 语言中的三个函数 %in%
、match()
和 which()
来实现该功能。这些函数都有各自的优缺点和适用场景,具体使用时需要根据实际情况选择适合的函数。