我有两个数据框:
require(tidyverse)
set.seed(42)
df1 = data_frame(x = c(4,3), y = c(0, 0), z = c(NA, 3))
df2 = data_frame(x = sample(1:4, 100, replace = T), y = sample(c(-3, 0, 3), 100, replace = T), z = c(NA, NA, rep(3, 98))) %>% mutate(Tracking = row_number())
我想为df1
的每一行和df1
的每一列分别 来查找{{1} }等于df2
。如果我尝试循环,那么每次迭代都会像这样:
df2
例如,列表的第一个元素是:
df1
但是,我敢肯定,有一种更有效的方法可以做到这一点。可能是for (i in 1: nrow(df1)){
for (j in 1: ncol(df1)) {
L[[i]][j] = inner_join(df1[i,j], df2)
}
}
+ inner_join(df1[1,1], df2)
Joining, by = "x"
# A tibble: 26 x 4
x y z Tracking
<dbl> <dbl> <dbl> <int>
1 4. 0. NA 1
2 4. -3. NA 2
3 4. 0. 3. 4
4 4. 3. 3. 13
5 4. 0. 3. 16
6 4. -3. 3. 17
7 4. 0. 3. 21
8 4. 0. 3. 23
9 4. 0. 3. 24
10 4. 3. 3. 28
# ... with 16 more rows
?我对dplyr
并没有太多的经验,但是我觉得purrr
函数可以派上用场。我只是不知道如何分别调用列。
答案 0 :(得分:0)
您可以做类似的事情
L <- map(names(df1),
function(.) {
out <- inner_join(x = df1[, ., drop = FALSE],
y = df2,
by = .)
split(out, out[[.]])
})
但是我不确定这是否比开始的for循环更好或更有效。