r-根据矢量索引而不是列名或索引筛选行

  • 本文关键字:索引 筛选 r dplyr
  • 更新时间 :
  • 英文 :


我有一个非常简单的样本数据帧df_test,如下所示:

df_test <- data.frame("A" = 1:5)    

我想选择包含5的行。我知道我可以通过使用filter()命令来实现:

df_analysis <- df_test %>% 
filter(A == 5)    

然而,我想运行一个for循环(因为实际的数据集有很多变量,而且很复杂(,因此,我不想手动逐个筛选列,而是希望运行一个列的for循环,它可以一次选择一个变量并相应地筛选行。对于本例,我将创建一个字符向量v作为v = c("A")

现在过滤,而不是使用列名,当我尝试使用这个向量索引作为:

df_analysis <- df_test %>% 
filter(v[1] == 5)    

它生成0行而不是1行。

如何使用矢量索引而不是列索引或名称来筛选行?

谢谢!

添加purrr后,您可以执行:

map(.x = v,
~ df_test %>%
filter(across(all_of(.x)) == 5))
[[1]]
A
1 5

我们可以使用base R

df_test[df_test[[v]] == 5, , drop = FALSE]

或使用dplyr,通过转换为symbol并评估(!!(

library(dplyr)
df_test %>%
filter(!! rlang::sym(v) == 5)
#  A
#1 5

或使用.data

df_test %>%
filter(.data[[v]] == 5)

在当前形式中,您的筛选操作会比较文本字符串"A";(即v[1]的内容(转换为数字5,这当然总是错误的,因此不能返回任何有效行。相反,您需要将变量A(包含在df_test中(作为第一个参数传递给filter()。你可以通过使用get()这样做:

df_analysis <- df_test %>% 
filter(get(v[1]) == 5)

这里使用purrr的另一个解决方案确实要好得多,但我想指出为什么您的代码没有按预期工作。

最新更新