【问题标题】:left_join a dataframe across multiple dataframes in a listleft_join 列表中跨多个数据帧的数据帧
【发布时间】:2020-05-12 09:38:16
【问题描述】:

我正在尝试 left_join 跨列表中多个数据框的数据框,这是列表和数据框的示例:

list1 = lapply(1:3, function(x) data.frame(x = rnorm(10), y = rnorm(10), z = rnorm(10), fac = sample(c("new","old"), 10, replace = TRUE)))

df_1 = data.frame(fac = sample(c("new","old"),10,replace = TRUE), t = rnorm(10))

现在,我确定我可以使用 for 循环和以下内容将数据框添加到列表的每个组件中。但是,我认为应该有一种使用 lapply 的简单方法来做到这一点,例如:

lapply(list1,function(x) x %>% left_join(x,df_1, by = c("fac")))

虽然这不起作用,但我哪里出错了?我猜你也可以从 purrr 中以某种方式使用map。上面示例中没有完全体现的一个重要方面是我需要通过匹配因子连接数据框,因此简单的 cbind 是不够的。

谢谢

【问题讨论】:

  • 试试lapply(list1, cbind, t=df_1$t)
  • 这只是将它绑定到数据帧上吗?我需要匹配的因素。我的 repex 不是很好,但我需要 df_1 中的因子来匹配列表中的因子,因此 left_join。
  • 是的,但你只有一种 "new" 的因子,应该是唯一的,因此这对我来说没有多大意义。
  • 我认为这更清楚。因子有多个级别,因此需要连接。
  • map(list1, left_join, df_1, by = "fac")list1df_1 中的每个数据帧执行左连接。然而,正如@jay.sf 已经指出的那样,这没有任何意义,因为基于fac 的匹配是任意的,即df_1 中的任何新的或旧的都可以与每个@ 中的任何其他新的或旧的匹配。 987654331@ 数据框。

标签: r dplyr left-join tidyverse


【解决方案1】:

我认为您正在寻找merge。但是,正如我在 cmets 中所述,您的合并列必须是唯一的。 例子:

list1   
# [[1]]
#            x          y          z fac
# 1  1.3709584  0.6328626  1.51152200   2
# 2 -0.5646982  0.4042683 -0.09465904   3
# 3  0.3631284 -0.1061245  2.01842371   1
# 
# [[2]]
#            x          y          z fac
# 1 -1.0861326 1.3149588  0.4822047   2
# 2  1.6133728 0.9781675  0.9657529   1
# 3  0.0356312 0.8817912 -0.8145709   3
# 
# [[3]]
#            x          y          z fac
# 1 -1.7813084  1.8951935 -1.7631631   1
# 2 -0.1719174 -0.4304691  0.4600974   2
# 3  1.2146747 -0.2572694 -0.6399949   3

df_1
#   fac u          t
# 1   1 1  0.1674409
# 2   2 2 -0.8798365
# 3   3 3  0.9469132

现在merge:

res <- lapply(list1, merge, df_1, by="fac")
res
# [[1]]
#   fac          x          y           z u          t
# 1   1  0.3631284 -0.1061245  2.01842371 1  0.1674409
# 2   2  1.3709584  0.6328626  1.51152200 2 -0.8798365
# 3   3 -0.5646982  0.4042683 -0.09465904 3  0.9469132
# 
# [[2]]
#   fac          x         y          z u          t
# 1   1  1.6133728 0.9781675  0.9657529 1  0.1674409
# 2   2 -1.0861326 1.3149588  0.4822047 2 -0.8798365
# 3   3  0.0356312 0.8817912 -0.8145709 3  0.9469132
# 
# [[3]]
#   fac          x          y          z u          t
# 1   1 -1.7813084  1.8951935 -1.7631631 1  0.1674409
# 2   2 -0.1719174 -0.4304691  0.4600974 2 -0.8798365
# 3   3  1.2146747 -0.2572694 -0.6399949 3  0.9469132

数据:

set.seed(42)
list1 <- replicate(3, data.frame(x=rnorm(3), y=rnorm(3), z=rnorm(3), 
                                 fac=sample(1:3, 3, replace=F)), simplify=F)

df_1 <- data.frame(fac=1:3, u=1:3, t=rnorm(3))

【讨论】:

  • 任何人都可以评论最后的评论,为什么加入 ins 不起作用?
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
相关资源
最近更新 更多