【发布时间】:2018-01-16 17:24:08
【问题描述】:
我有这两个数据框:
set.seed(42)
A <- data.table(station = sample(1:10, 1000, replace=TRUE),
hash = sample(letters[1:5], 1000, replace=TRUE),
point = sample(1:24, 1000, replace=TRUE))
B <- data.table(station = sample(1:10, 100, replace=TRUE),
card = sample(letters[6:10], 100, replace=TRUE),
point = sample(1:24, 100, replace=TRUE))
数据框 A 包含超过 1M 行。
我尝试为每个 card(来自 B)找到 hash(来自 A)。我在那里有一些条件:A中的stations和points位于一个范围内(对于站+- 1,对于点+ 2)。
我使用card 对 B 进行分组,并在实现此类条件后为每个组函数执行绑定行并按频率获取最大值。
detect <- function(x){
am0 <- data.frame(station = 0,
hash = 0,
point = 0)
for (i in 1:nrow(x)) {
am1 <- A %>%
filter(station %in% (B$station[i] - 1) : (B$station[i] + 1) &
point > B$point[i] & point < B$point[i] + 2)
am0 <- rbind(am0, am1)
}
t <- as.data.frame(table(am0$hash))
t <- t %>%
arrange(-Freq) %>%
filter(row_number() == 1)
return(t)
}
然后就是:
library(dplyr)
B %>%
group_by(card) %>%
do(detect(.)) %>%
ungroup
但我不知道如何使用索引[i] 实现每个组的功能,所以我实际上得到了错误的结果。
# A tibble: 5 x 3
card Var1 Freq
<chr> <fctr> <int>
1 f c 46
2 g c 75
3 h c 41
4 i c 64
5 j c 62
我是初学者,但我知道大型数据集的最佳解决方案 - 使用 data.table 库连接 2 个这样的数据集。你能帮我做决定吗?
【问题讨论】:
标签: r dplyr data.table