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))