Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.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 按组id合并两个不同长度的数据帧_R_Merge - Fatal编程技术网

R 按组id合并两个不同长度的数据帧

R 按组id合并两个不同长度的数据帧,r,merge,R,Merge,我正在尝试按组id合并两个数据帧。但是,两个数据帧的长度不同,并且在第二个数据帧中缺少某些组的某些元素。在合并的文件中,某个组缺少的元素应该是NAs 数据看起来像这样 df1 <- data.frame(id = c(1,1,1,2,3,3,4), x = c("a", "b", "c", "d", "e", "f", "g")) df2 <- data.frame(id = c(1,1,2,3,4), y = c("A", "B", "D", "E", "G")) df1此数据。

我正在尝试按组id合并两个数据帧。但是,两个数据帧的长度不同,并且在第二个数据帧中缺少某些组的某些元素。在合并的文件中,某个组缺少的元素应该是NAs

数据看起来像这样

df1 <- data.frame(id = c(1,1,1,2,3,3,4), x = c("a", "b", "c", "d", "e", "f", "g"))
df2 <- data.frame(id = c(1,1,2,3,4), y = c("A", "B", "D", "E", "G"))

df1此
数据。表
解决方案可能有效

首先,为每个组创建行id。这些行id上的join by id

library(data.table)
dt1 <- data.table(id = c(1,1,1,2,3,3,4), x = c("a", "b", "c", "d", "e", "f", "g"))
dt2 <- data.table(id = c(1,1,2,3,4), y = c("A", "B", "D", "E", "G"))

#rumber rows by group
dt1[ , row_id := seq.int(1:.N), by = .(id)]
dt2[ , row_id := seq.int(1:.N), by = .(id)]

dt1[dt2, y := i.y, on = .(id, row_id)][, row_id := NULL][]

#    id x    y
# 1:  1 a    A
# 2:  1 b    B
# 3:  1 c <NA>
# 4:  2 d    D
# 5:  3 e    E
# 6:  3 f <NA>
# 7:  4 g    G
库(data.table)

dt1当在
id
上加入时,R如何知道一个时间id=1-->y=A,另一个时间id=1-->y=B。。。x和y之间有关系吗?不是很明确,这就是问题所在。这是我之前做的一些操作的结果,从技术上讲,这两者之间的联系就是它们的分类方式。因此,如果组1由x=a,b,c组成,那么y中任何未缺失的值都必须是相同的顺序。只有某个组的最后n个值可以丢失。不能重复,因为在加入之前需要进行一些数据准备。实际的连接不是这里的问题。也许你可以更好地解释这个过程。我所看到的是,如果大写字母存在的话,你正在将x中的小写字母与y中的大写字母进行匹配。还有别的吗?或者你能给y添加一个小写版本,然后在ID和小写上左键连接吗?基于注释的更新答案所以谢谢你向我介绍data.tables,这是一个多么神奇的软件包!
library(data.table)
dt1 <- data.table(id = c(1,1,1,2,3,3,4), x = c("a", "b", "c", "d", "e", "f", "g"))
dt2 <- data.table(id = c(1,1,2,3,4), y = c("A", "B", "D", "E", "G"))

#rumber rows by group
dt1[ , row_id := seq.int(1:.N), by = .(id)]
dt2[ , row_id := seq.int(1:.N), by = .(id)]

dt1[dt2, y := i.y, on = .(id, row_id)][, row_id := NULL][]

#    id x    y
# 1:  1 a    A
# 2:  1 b    B
# 3:  1 c <NA>
# 4:  2 d    D
# 5:  3 e    E
# 6:  3 f <NA>
# 7:  4 g    G