我有一个非常简单的样本数据帧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
,通过转换为sym
bol并评估(!!
(
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
的另一个解决方案确实要好得多,但我想指出为什么您的代码没有按预期工作。