📌  相关文章
📜  根据 R 中向量中的值从 DataFrame 中选择行(1)

📅  最后修改于: 2023-12-03 14:55:39.269000             🧑  作者: Mango

根据 R 中向量中的值从 DataFrame 中选择行

在 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
subset() 函数

在 R 语言中,可以使用 subset() 函数,根据指定条件筛选 DataFrame 中的行。该函数有两个必须的参数 xsubset,其中:

  • 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" 的行。

但是,如果我们要根据一个向量中的值进行条件筛选,该怎么做呢?接下来我们来看几种策略。

使用 %in% 运算符

在 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" 的行被保留了下来。

使用 match() 函数

在 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() 函数中的逻辑条件要求匹配。

使用 which() 函数

在 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() 来实现该功能。这些函数都有各自的优缺点和适用场景,具体使用时需要根据实际情况选择适合的函数。