Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 动态连接多个表 问题_R_Dataframe_Join - Fatal编程技术网

R 动态连接多个表 问题

R 动态连接多个表 问题,r,dataframe,join,R,Dataframe,Join,大家好 我正在尝试动态地将几个数据帧连接在一起。对我来说,这意味着我有一个以df_a开始的数据帧,我想将多个其他数据帧df_B1,df_B2,df_B3等连接到该数据帧 df_A包含一列,用于每个df_B…表的联接Column\u join\u B1、Column\u join\u B2、Column\u join\u B3,等等(尽管实际上这些名称不太清楚)。这些名称也位于向量df\u a\u join\u name中 df_B1,df_B2,df_B3等。。存储在列表df_B中,我认为这是一

大家好

我正在尝试动态地将几个数据帧连接在一起。对我来说,这意味着我有一个以
df_a
开始的数据帧,我想将多个其他数据帧
df_B1
df_B2
df_B3
等连接到该数据帧

df_A
包含一列,用于每个
df_B…
表的联接
Column\u join\u B1
Column\u join\u B2
Column\u join\u B3
,等等(尽管实际上这些名称不太清楚)。这些名称也位于向量
df\u a\u join\u name

df_B1
df_B2
df_B3
等。。存储在列表
df_B
中,我认为这是一种很好的做法:)。这也是我在循环中访问它们的方式

每一个都有两列。其中一个具有要根据
df_A
连接的值,另一个具有信息

我甚至尝试在加入之前重命名第一列以匹配
df_A
中的列,但没有成功

我在尝试什么
left\u join()
不允许我简单地使用
by=c(df\u A\u join\u names[1],“Column\u join\u A”)
,因此我必须使用
setNames
,但我无法实现这一点

下面是我想在循环中迭代的函数:

my_join <- function(df_a, df_b, a_name, b_name){ 

  df_joined <- left_join(df_a, df_b, 
                            by = setNames(b_name, a_name))
  return(df_joined)
}
运行此命令,我得到:

 Error in UseMethod("tbl_vars") : 
  no applicable method for 'tbl_vars' applied to an object of class "list" 
一些可以玩的东西
#使DFU成为

你非常接近!唯一需要更改的是引用列表df_B下的数据帧的方式。df_B[1]仍然是一个列表,df_B[[1]]将返回一个数据帧。我运行了下面的代码,它对我有效

for (i in 1: length(df_A_join_names)){

  df_A <- my_join(df_a = df_A,
                  df_b = df_B[[i]],
                  a_name = as.character(df_A_join_names[i]),
                  b_name = "Column_join_A"
  )
}
for(i in 1:长度(df_A_join_name)){

df_A无需构建特定函数,只需在left_join函数中使用集合名即可:

df_B_join_name <- "Column_join_A"

for (i in 1: length(df_A_join_names)){
  df_A <- left_join(df_A, df_B[[i]], by=c(setNames(nm = df_A_join_names[i], df_B_join_name)))
}   

df_B_join_name首先,设法重命名
df_B
中的第一列,以匹配
df_A
中的列。因此
df_B
将如下所示:

# [[1]]
#    Column_join_B1 B_a
# 1              11   A
# 2              12   B
# .              .    .
# .              .    .
# .              .    .
# 
# [[2]]
#    Column_join_B2 B_b
# 1              21   K
# 2              22   L
# .              .    .
# .              .    .
# .              .    .
接下来,使用
base
中的
Reduce()
purr
中的
Reduce()
来迭代
左join
的操作。您甚至不需要使用for循环

Reduce(left_join, df_B, init = df_A)

#    A_a Column_join_B1 Column_join_B2 B_a B_b
# 1    1             11             21   A   K
# 2    2             12             22   B   L
# 3    3             13             23   C   M
# 4    4             14             24   D   N
# 5    5             15             25   E   O
# 6    6             16             26   F   P
# 7    7             17             27   G   Q
# 8    8             18             28   H   R
# 9    9             19             29   I   S
# 10  10             20             30   J   T

您想将
df_B
中的所有数据集加入
df_A
以生成一个新数据吗?还是将
df_B
中的每个数据集分别加入
df_A
以获得多个数据?我想将
df_B
中的所有数据集加入
df_A
以获得一个数据帧。
# [[1]]
#    Column_join_B1 B_a
# 1              11   A
# 2              12   B
# .              .    .
# .              .    .
# .              .    .
# 
# [[2]]
#    Column_join_B2 B_b
# 1              21   K
# 2              22   L
# .              .    .
# .              .    .
# .              .    .
Reduce(left_join, df_B, init = df_A)

#    A_a Column_join_B1 Column_join_B2 B_a B_b
# 1    1             11             21   A   K
# 2    2             12             22   B   L
# 3    3             13             23   C   M
# 4    4             14             24   D   N
# 5    5             15             25   E   O
# 6    6             16             26   F   P
# 7    7             17             27   G   Q
# 8    8             18             28   H   R
# 9    9             19             29   I   S
# 10  10             20             30   J   T