R遍历数据帧的列,按每一列过滤

时间:2020-11-05 23:08:07

标签: r

我有一个数据框,用于查看数据输入中的错误。 它具有两组变量:

  1. 一组错误标志(它们的名称将包含“错误”)。
  2. 一组是有关已标记案例的信息(在本例中为“值”列)。

我想遍历错误标志变量,在每列中以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”,得到相同的结果。

有人可以提供一些指导吗?

2 个答案:

答案 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, ]
相关问题