R 分组匹配

R 分组匹配,r,match,R,Match,在一个特定的问题中,我试图将一个数字/字符串与不同的子组相匹配 set.seed(1) n <- 1e5 groups <- list(0, 1:3, 5:9, 10:33, 35, 36:39, 41:43, 45:47, 49:53, 55:56, 58:63, 64:65, 68, 69:75, 77:82, 84, 85,

在一个特定的问题中,我试图将一个数字/字符串与不同的子组相匹配

set.seed(1)
n <- 1e5
groups <- list(0, 1:3, 5:9, 10:33,  
               35, 36:39, 41:43,
               45:47, 49:53,
               55:56, 58:63,
               64:65, 68, 69:75, 
               77:82, 84, 85,
               86:89, 90:93,
               94:96, 97:98, 99)
dat <- sample(unlist(groups), n, TRUE)
但是有更简洁的方法吗?

注:最终结果为
out
,该表仅用于匹配可视化。例如,最终结果应该与
out
匹配,而不是
表(out)

不需要
for
循环。要获取计数,可以使用
dat
direct

i <- lapply(groups, function(x) which(dat %in% x))
out[unlist(i)] <- rep(seq_along(i), lengths(i))
table(out)
#out
#    1     2     3     4     5     6     7     8     9    10    11    12    13 
# 1144  3384  5587 26892  1165  4501  3348  3299  5702  2177  6751  2218  1134 
#   14    15    16    17    18    19    20    21    22 
# 7810  6792  1106  1091  4526  4606  3370  2246  1151 

i一个选项是将
堆栈
enframe
放入单个数据集中,然后进行计数

library(dplyr)
stack(setNames(groups, seq_along(groups))) %>%
     group_by(ind) %>% 
     summarise(Count = sum(dat %in% values))
# A tibble: 22 x 2
#   ind   Count
#   <fct> <int>
# 1 1      1144
# 2 2      3384
# 3 3      5587
# 4 4     26892
# 5 5      1165
# 6 6      4501
# 7 7      3348
# 8 8      3299
# 9 9      5702
#10 10     2177
# … with 12 more rows

您好@GKI问题的重点不是最终的计数表,而是
out
中包含的实际匹配。对不起。希望更新后的答案是你想要的。再次@GKI,谢谢。这相当简单和快速。:-)也许使用查找表更快-我添加了一个示例。这确实快了50倍。接近,但与GKi的初始答案类似,问题的重点是获得
out
的结果,而不是
table(out)
@Oliver抱歉,因为我在
表上查看,所以出现了混乱
lup <- numeric(0)
lup[unlist(groups)+1] <- rep(seq_along(groups), lengths(groups))
out <- lup[dat+1]
library(dplyr)
stack(setNames(groups, seq_along(groups))) %>%
     group_by(ind) %>% 
     summarise(Count = sum(dat %in% values))
# A tibble: 22 x 2
#   ind   Count
#   <fct> <int>
# 1 1      1144
# 2 2      3384
# 3 3      5587
# 4 4     26892
# 5 5      1165
# 6 6      4501
# 7 7      3348
# 8 8      3299
# 9 9      5702
#10 10     2177
# … with 12 more rows
library(tibble)
library(tidyr)
enframe(groups) %>%
    unnest(c(value)) %>%
    group_by(name) %>%
    summarise(Count = sum(dat %in% value))