首页 > 解决方案 > 在 R 中,在不同数据框中具有相同名称的列之间分别应用一个函数

问题描述

我有两个数据框:

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

我想分别为 的每一行df1AND 的每一列df1找到等于的索引df2。如果我尝试循环,那么每次迭代将如下所示:df2df1

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? 我没有太多经验purrr,但我觉得这个map功能可以派上用场。我只是不知道如何分别调用这些列。

标签: rdplyrinner-joinpurrr

解决方案


你可以做类似的事情

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

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


推荐阅读