我有一个数据框,用于查看数据输入中的错误。 它具有两组变量:
我想遍历错误标志变量,在每列中以1的值过滤数据框,然后打印。
我的问题是我无法让R将列名识别为要过滤的名称。 我在寻找其他示例,但没有满足需要。
在此示例中,我有一个数据框'test_df',其中包含四个变量:error_1-error_3和值。 我想遍历这三个错误变量,并过滤test_df以获取值为1的行。
# set up libraries:
library(tidyverse)
library(magrittr)
# Create the data set 'test_df':
test_df <- structure(list(error_1 = c(0, 0, 1, 1), error_2 = c(0, 0, 1,
1), error_3 = c(0, 0, 1, 1), values = c(1, 2, 3, 4)), class = "data.frame", row.names = c(NA,
-4L))
# Pull the column names from test_df, retaining only those with 'error' in their name, and print:
names_test_df <- test_df %>%
dplyr::select(.,contains("error")) %>%
names()
test_df
names_test_df
> test_df
error_1 error_2 error_3 values
1 0 0 0 1
2 0 0 0 2
3 1 1 1 3
4 1 1 1 4
> names_test_df
[1] "error_1" "error_2" "error_3"
这是麻烦开始的地方-我不知道如何将names_test_df的元素提供给函数,以便在test_df中将它们识别为列名:
test_df %>% dplyr::filter(.,error_1==1)
test_df %>% dplyr::filter(.,as.character(names_test_df[1])==1)
test_df %>% dplyr::filter(.,noquote(names_test_df[1])==1)
> test_df %>% dplyr::filter(.,error_1==1)
error_1 error_2 error_3 values
1 1 1 1 3
2 1 1 1 4
> test_df %>% dplyr::filter(.,as.character(names_test_df[1])==1)
[1] error_1 error_2 error_3 values
<0 rows> (or 0-length row.names)
> test_df %>% dplyr::filter(.,noquote(names_test_df[1])==1)
[1] error_1 error_2 error_3 values
<0 rows> (or 0-length row.names)
我还玩过循环使用colnames(test_df)中的“ item”,得到相同的结果。
有人可以提供一些指导吗?
答案 0 :(得分:0)
我们可以将字符串转换为sym
bol并求值(!!
)
library(dplyr)
test_df %>%
dplyr::filter(., !! rlang::sym(names_test_df[1])==1)
# error_1 error_2 error_3 values
#1 1 1 1 3
#2 1 1 1 4
或带有across
test_df %>%
filter(across(all_of(names_test_df[1]), ~ . == 1))
# error_1 error_2 error_3 values
#1 1 1 1 3
#2 1 1 1 4
答案 1 :(得分:0)
在基数R中,您可以使用[
来对列进行子集化。对于一列,您可以执行以下操作:
test_df[test_df[names_test_df[1]] == 1, ]
# error_1 error_2 error_3 values
#3 1 1 1 3
#4 1 1 1 4
对于不止一列,我们希望选择其中任何一列为1的行。
test_df[rowSums(test_df[names_test_df] == 1) > 0, ]