使用筛选器(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)