【发布时间】:2015-08-05 07:14:41
【问题描述】:
我有两个数据框,第一个包含 9994 行,第二个包含 60431 行。我想合并两个数据框,使合并的数据框包含两个数据框的组合列,但仅包含 9994 行。
但是,合并后我得到了超过 9994 行。如何确保不会发生这种情况?
df1 = readRDS('data1.RDS')
nrow(df1)
# [1] 9994
df2 = readRDS('data2.RDS')
nrow(df2)
# [1] 60431
df = merge(df1,df2,by=c("col1","col2"))
nrow(df)
# [1] 10057
df = merge(df1,df2,by=c("col1","col2"),all.x=TRUE)
nrow(df)
# [1] 10057
nrow(na.omit(df))
# [1] 10057
编辑:按照 akrun 的评论。 是的,第二个数据框中有重复项
nrow(unique(df2[,c("col1","col2")]))
# [1] 60263
nrow(df2)
# [1] 60431
如果同一 {col1,col2} 组合有多个,我如何才能从数据框中只取一行。当我合并时,我希望只有 9994 行。
【问题讨论】:
-
您能否检查每个数据集中是否存在“col1”和“col2”的重复项?如果是这种情况,您可以创建一个序列索引,在每个数据集中按“col1”和“col2”分组,并按“col1”、“col2”和“indx”进行合并。另一种选择是使用
match。但是,没有一个小例子,很难测试 -
@akrun,谢谢 akrun。我在上面做了一个编辑。请参见。我怎样才能只为 col1,col2 组合取一行,以便在合并时得到与第一个数据框中一样多的行?
-
您可能需要创建一个序列索引,正如我之前评论的那样。没有示例数据,很难测试。请展示一些可重现的示例
-
你需要创建一个序列来索引它,正如 akrun 提到的那样。
-
我认为
indx不会解决问题。我认为有必要决定如何处理df2中的重复案例,即取第一个、最后一个、平均等,以便只有df1和df2中的额外列。跨度>