在R中,在不同数据框中具有相同名称的列之间分别应用函数

时间:2018-07-18 12:45:11

标签: r dplyr inner-join purrr

我有两个数据框:

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函数可以派上用场。我只是不知道如何分别调用列。

1 个答案:

答案 0 :(得分:0)

您可以做类似的事情

L <- map(names(df1),
         function(.) {
             out <- inner_join(x = df1[, ., drop = FALSE],
                               y = df2,
                               by = .)
             split(out, out[[.]])
         })

但是我不确定这是否比开始的for循环更好或更有效。