我试图在一个列表中的多个数据框中左键连接一个数据框,这里是一个列表和数据框的例子。
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")))
虽然这不行,但我到底错在哪里?我猜你也可以用 map
以某种方式从 purrr。在上面的例子中,有一个重要的方面没有完全体现出来,那就是我需要用匹配的因子加入数据框,因此简单的cbind是不够的。
谢谢你
我想你要找的是 merge
. 然而,正如我在评论中已经说过的,你的合并列需要是唯一的。例子:现在,你的合并列需要是唯一的。
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))