使用筛选器(dplyr)在多个列中循环以匹配多个值

使用筛选器(dplyr)在多个列中循环以匹配多个值,r,loops,R,Loops,我有以下数据集“数据”: A1 A2 A3 A4 A5 case1 1234 2234 223 4455 7334 case2 1254 2234 200 case3 1234 9234 case4 1274 5234 228 4655 2534 case5 1234 2634 273 7455 每行表示一个案例,每列表示该案例的代码属性,其中每个案例可以有多个代码,也可以根本没有代码。任何情

我有以下数据集“数据”:

       A1    A2    A3    A4    A5   
case1  1234  2234  223   4455  7334
case2  1254  2234  200   
case3  1234  9234  
case4  1274  5234  228   4655  2534
case5  1234  2634  273   7455  
每行表示一个案例,每列表示该案例的代码属性,其中每个案例可以有多个代码,也可以根本没有代码。任何情况下都不能有同一代码的多个实例

同样重要的是,每个代码可以是3位或4位,4位代码是3位代码的子代码。例如,“123”将是比“1234”更广泛的代码;“4”表示更具体的“123”代码类型

我最初用于提取代码为“1234”的案例的功能是

dataf <- filter(data, A1:A5 == 1234)


,因为查询这两个范围将返回与父代码和子代码的任何实例都匹配的案例。

您可以尝试以下方法:

x <- c(123:150, 1230:1500)
filter(df, rowSums(mutate_each(df, funs(. %in% x))) >= 1L)
#   case   A1   A2  A3   A4   A5
#1 case1 1234 2234 223 4455 7334
#2 case2 1254 2234 200   NA   NA
#3 case3 1234 9234  NA   NA   NA
#4 case4 1274 5234 228 4655 2534
#5 case5 1234 2634 273 7455   NA
内部函数生成逻辑值的data.frame:

mutate_each(df, funs(. %in% x))
#   case   A1    A2    A3    A4    A5
#1 FALSE TRUE FALSE FALSE FALSE FALSE
#2 FALSE TRUE FALSE FALSE FALSE FALSE
#3 FALSE TRUE FALSE FALSE FALSE FALSE
#4 FALSE TRUE FALSE FALSE FALSE FALSE
#5 FALSE TRUE FALSE FALSE FALSE FALSE
这与使用
sapply

sapply(df, function(.) . %in% x)
#      case   A1    A2    A3    A4    A5
#[1,] FALSE TRUE FALSE FALSE FALSE FALSE
#[2,] FALSE TRUE FALSE FALSE FALSE FALSE
#[3,] FALSE TRUE FALSE FALSE FALSE FALSE
#[4,] FALSE TRUE FALSE FALSE FALSE FALSE
#[5,] FALSE TRUE FALSE FALSE FALSE FALSE

然后使用
rowSums
检查每一行是否至少有一个值为真,从而相应地将数据子集。

我认为这是一个数据格式问题,因此首先让我们将数据转换为正确的格式:'

df <- read.table(text = '       A1    A2    A3    A4    A5   
case1  1234  2234  223   4455  7334
case2  1254  2234  200   NA    NA
case3  1234  9234  NA    NA    NA
case4  1274  5234  228   4655  2534
case5  1234  2634  273   7455  NA')

library(dplyr)
library(tidyr)
newdf <- df %>%
          mutate(case = rownames(df)) %>%
          gather(Anum, code, -case)

> head(newdf)
#   case Anum code
#1 case1   A1 1234
#2 case2   A1 1254
#3 case3   A1 1234
#4 case4   A1 1274
#5 case5   A1 1234
#6 case1   A2 2234
df%
收集(Anum、代码、案例)
>团长(新发展基金)
#case Anum代码
#1个案1 A1 1234
#2案例2 A1 1254
#3案例3 A1 1234
#4案例4 A1 1274
#5案例5 A1 1234
#6案例1 A2 2234
现在,您可以仅对一列运行筛选器:

filtdf <- filter(newdf, code == 1234)
#  case Anum code
#1 case1   A1 1234
#2 case3   A1 1234
#3 case5   A1 1234
filtedf 122&code<151)

Ace,知道重塑2::melt()但不知道
tidyr::gather()
。谢谢
mutate_each(df, funs(. %in% x))
#   case   A1    A2    A3    A4    A5
#1 FALSE TRUE FALSE FALSE FALSE FALSE
#2 FALSE TRUE FALSE FALSE FALSE FALSE
#3 FALSE TRUE FALSE FALSE FALSE FALSE
#4 FALSE TRUE FALSE FALSE FALSE FALSE
#5 FALSE TRUE FALSE FALSE FALSE FALSE
sapply(df, function(.) . %in% x)
#      case   A1    A2    A3    A4    A5
#[1,] FALSE TRUE FALSE FALSE FALSE FALSE
#[2,] FALSE TRUE FALSE FALSE FALSE FALSE
#[3,] FALSE TRUE FALSE FALSE FALSE FALSE
#[4,] FALSE TRUE FALSE FALSE FALSE FALSE
#[5,] FALSE TRUE FALSE FALSE FALSE FALSE
df <- read.table(text = '       A1    A2    A3    A4    A5   
case1  1234  2234  223   4455  7334
case2  1254  2234  200   NA    NA
case3  1234  9234  NA    NA    NA
case4  1274  5234  228   4655  2534
case5  1234  2634  273   7455  NA')

library(dplyr)
library(tidyr)
newdf <- df %>%
          mutate(case = rownames(df)) %>%
          gather(Anum, code, -case)

> head(newdf)
#   case Anum code
#1 case1   A1 1234
#2 case2   A1 1254
#3 case3   A1 1234
#4 case4   A1 1274
#5 case5   A1 1234
#6 case1   A2 2234
filtdf <- filter(newdf, code == 1234)
#  case Anum code
#1 case1   A1 1234
#2 case3   A1 1234
#3 case5   A1 1234
filter(newdf, code > 122 & code < 151)