Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.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 使用Df1和相等数据帧列表进行左联合_R_Dataframe_Left Join - Fatal编程技术网

R 使用Df1和相等数据帧列表进行左联合

R 使用Df1和相等数据帧列表进行左联合,r,dataframe,left-join,R,Dataframe,Left Join,我在连接4个数据帧时遇到问题。我在一个安全的环境中使用远程访问,因此很遗憾,我无法向您提供我的R会话和代码的屏幕截图 我有R版本3.4.1 包装整洁 Df1-一个数据框有280000行和20个变量,这是我的主要数据集,它包含诊断数据、医院科室和位置数据 HA1,HA2,HA3-其他3个数据集各有2300万到2500万行和7个变量,所有3个数据集中的变量相等。这些数据集包含三个不同年份的医疗活动数据 我想使用变量“A”和左连接来连接这些数据集。与中一样,仅将医疗保健活动保留在HA1-3中,且在Df

我在连接4个数据帧时遇到问题。我在一个安全的环境中使用远程访问,因此很遗憾,我无法向您提供我的R会话和代码的屏幕截图

我有R版本3.4.1 包装整洁

Df1-一个数据框有280000行和20个变量,这是我的主要数据集,它包含诊断数据、医院科室和位置数据

HA1,HA2,HA3-其他3个数据集各有2300万到2500万行和7个变量,所有3个数据集中的变量相等。这些数据集包含三个不同年份的医疗活动数据

我想使用变量“A”和左连接来连接这些数据集。与中一样,仅将医疗保健活动保留在HA1-3中,且在Df1中具有匹配的诊断/医院

我用HA1做了一个测试:

test = left_join(Df1, HA1, by= "A")
这很有效。 但在我尝试将HA2和HA3添加到数据集之后,它添加了新变量,而不是填充已经添加的HA1变量的NAs。(变量x、变量y)

在此之后,我在HA数据集上尝试了rbind,但这些数据集太大,我得到一个错误:“无法分配大小的向量…”

所以我尝试了带有reduce函数的purrr包,但是我遇到了同样的问题

list(Df1, HA1, HA2, HA3) %>% reduce(left_join, by = "A")
我试图创建的数据集包含20个df1变量和7个HA1-3变量。我尝试将HA数据集的7个变量一次性添加到Df1中,并在相同的列中添加所有匹配的HA1-3


希望您能够在没有R屏幕截图的情况下帮助我解决这个问题。

left\u join将始终添加新列,而不是填充现有列。一个简单的解决方案是使用
合并
将三个新列合并为一个列。下面是一个包含虚拟数据和三个数据帧的示例:

d<-data.frame(A=LETTERS[1:5])
e<-data.frame(A=LETTERS[1:3],b=1:3)
f<-data.frame(A=LETTERS[4:5],b=4:5)
left_join(d,e,by="A") %>% left_join(f,by="A") %>%
mutate(newb=coalesce(b.x,b.y))

  A b.x b.y newb
1 A   1  NA    1
2 B   2  NA    2
3 C   3  NA    3
4 D  NA   4    4
5 E  NA   5    5

d使用data.table包进行测试。data.frame操作有时会创建它的另一个副本,它可能会消耗太多可用的系统RAM。使用merge代替left\u join,使用rbindlist代替reduce/rbind。当你的数据集看起来很大时,建议这样做。+10可以使用
purrr::reduce(list(d,e,f),~left_join(.x,.y,by=“A”)
来执行连接,以便更好地扩展到更多的
数据。frame
sAbsolutely right,@zack。因为OP似乎只有四个,所以我不想把答案复杂化。
d<-data.frame(A=LETTERS[1:5])
e<-data.frame(A=LETTERS[1:3],b=1:3)
f<-data.frame(A=LETTERS[4:5],b=4:5)
left_join(d,e,by="A") %>% left_join(f,by="A") %>%
mutate(newb=coalesce(b.x,b.y))

  A b.x b.y newb
1 A   1  NA    1
2 B   2  NA    2
3 C   3  NA    3
4 D  NA   4    4
5 E  NA   5    5