当前位置: 首页 > 知识库问答 >
问题:

R合并列上的两个数据框保持列

华乐逸
2023-03-14

抱歉,如果这是重复的请让我知道,我会很乐意删除。

我使用< code>merge合并R中的两个数据集。

age1 = c(5, 6, 7, 8, 10, 11) 
fname1 = c('david','alan','ben', 'ben', 'richard', 'edd') 
sname1 = c('albert','raymond','albert','pete','raymond', 'alan')
area1 = c('r','t','n','x','z','w')

df1 <- data.frame(age1, fname1, sname1, area1)

age2 = c(5, 9, 10, 3, 4, 0) 
fname2 = c('david','alan','david', 'ben', 'richard', 'edd') 
sname2 = c('albert','edd','albert','pete','raymond', 'alan')
area2 = c('w','z','x','n','t','r')

df2 = data.frame(age2, fname2, sname2, area2)

数据集1:

df1
  age1  fname1  sname1 area1
1    5   david  albert     r
2    6    alan raymond     t
3    7     ben  albert     n
4    8     ben    pete     x
5   10 richard raymond     z
6   11     edd    alan     w

数据集2

df2
  age2  fname2  sname2 area2
1    5   david  albert     w
2    9    alan     edd     z
3   10   david  albert     x
4    3     ben    pete     n
5    4 richard raymond     t
6    0     edd    alan     r

我在< code>fname和< code>sname上合并:

matchkey <- merge(df1, df2, by.x = c("fname1", "sname1"), by.y = c("fname2", "sname2"))
View(matchkey)

输出:

> matchkey
   fname1  sname1 age1 area1 age2 area2
1     ben    pete    8     x    3     n
2   david  albert    5     r    5     w
3   david  albert    5     r   10     x
4     edd    alan   11     w    0     r
5 richard raymond   10     z    4     t

但是,我想保留已合并的列。我该怎么做?我应该使用merge以外的东西吗?

预期产出:

   fname1  sname1 age1 area1  fname2   sname 2age2  area2
1     ben    pete    8     x  ben    pete      3       n
2   david  albert    5     r  david  albert    5       w
3   david  albert    5     r  david  albert    10      x
4     edd    alan   11     w  edd    alan      0       r
5 richard raymond   10     z  richard raymond  4       t

我试过看,但没有成功:

如何基于两列合并两个数据框?

组合两个数据帧,保留所有列

合并具有重复列的两个数据帧

非常感谢。

共有1个答案

裴威
2023-03-14

由于合并的列在内部连接时完全相同,或者数据帧之间完全匹配,所以只需将新列分配给剩余的列即可。您可以使用transform()执行此操作。下面添加outer()paste0的组合,以检索所需的列顺序:

matchkey <- transform(merge(df1, df2, by.x = c("fname1", "sname1"), 
                                      by.y = c("fname2", "sname2")),
                      fname2 = fname1, sname2 = sname1)

ordercols <- c(outer(c("fname", "sname", "age", "area"), c(1:2), paste0))
matchkey <- matchkey[ordercols]

matchkey    
#    fname1  sname1 age1 area1  fname2  sname2 age2 area2
# 1     ben    pete    8     x     ben    pete    3     n
# 2   david  albert    5     r   david  albert    5     w
# 3   david  albert    5     r   david  albert   10     x
# 4     edd    alan   11     w     edd    alan    0     r
# 5 richard raymond   10     z richard raymond    4     t
 类似资料:
  • 问题内容: 我正在尝试使用两列来连接两个熊猫数据框: 但出现以下错误: 任何想法应该是正确的方法吗?谢谢! 问题答案: 尝试这个 https://pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.merge.html left_on:要在左侧DataFrame中加入的标签或列表或类似数组的字段名称。可以是Dat

  • 问题内容: 我有两个数据框df1和df2。df1包含人的年龄信息,而df2包含人的性别信息。并非所有人都在里面df1或里面df2 我想有人民的性别的信息df1和设置NaN,如果我没有在这个信息df2。我尝试这样做,但是我保留了一些df2我不想要的信息。 问题答案: 使用map由创建人: merge左连接的替代解决方案: 如果需要通过多列映射(例如Year和Code),则需要merge左连接: 如果

  • 问题内容: 我有2个数据框: restaurant_ids_dataframe 和 restaurant_review_frame 我想使用熊猫中的DataFrame.join()命令将这两个DataFrame加入一个单一的数据框中。 我尝试了以下代码行: 但是,当我尝试这样做时,出现以下错误: 我对熊猫很陌生,不知道就执行join语句而言我在做什么错。 任何帮助将非常感激。 问题答案: 您可以使

  • 我有两个熊猫数据帧共享一个共同的列名。我想合并公共列名,但保留与第二个dataFrame中的所有不同列,其中公共列名称匹配。下面是两个数据帧的示例: 我希望预期的结果是: 也就是说,当列“A”匹配时,我希望保留I,J,K,L的行,并且不等于“NaN ”,对于DF1中的列也是如此。 我已经尝试了所有的pd.merge选项,但是它们似乎没有做我上面要求的事情。例如, 在“A”上匹配并将所有键保留在左侧

  • 问题内容: 我肯定在这里错过了一些简单的事情。尝试在熊猫中合并具有相同列名的两个数据框,但右侧的数据框具有一些左侧没有的列,反之亦然。 我试着加入外部联接: 但这产生了: 我还指定了一个要连接的单列(例如on =“ id”),但是它复制了除“ id”以外的所有列,例如attr_1_x,attr_1_y,这并不理想。我也将整个列列表(有很多)传递给了“ on”: 产生: 我想念什么?我想获得一个带有

  • 问题内容: 我在加入熊猫方面遇到问题,并且试图找出问题所在。假设我有一个x: 我应该能够通过简单的连接命令在y = x上将y与索引上的y联接,除了同名具有+2。 我希望决赛对双方都有1941个非值。我也尝试过合并,但是我有同样的问题。 我以为正确的答案是pandas.concat([x,y]),但这也不符合我的预期。 编辑:如果您在加入方面遇到问题,请阅读下面的韦斯答案。我有一个重复的时间戳。 问

  • 问题内容: 我有以下数据框: 如何合并索引以获取: 我问,因为据我了解,即使用列进行匹配。实际上,这样做我得到: 在索引上合并是不好的做法吗?不可能吗 如果是这样,如何将索引移到称为“索引”的新列中? 问题答案: 使用,默认情况下是内部联接: 或,默认情况下为左连接: 或,默认情况下为外部联接: 样品 :

  • 问题内容: 我正在使用下面的代码合并两个csv(数据帧): 我有以下CSV文件 文件1: 文件2: 合并后 如果您注意到student_id的开头附加了0,应该将其视为文本,但是在合并并使用函数后,它将其转换为数字并删除了前导0。 即使在to_csv之后,如何将列保持为“文本”? 我认为它的to_csv函数可以再次保存为数字添加了dtype = {‘student_id’:str}。 问题答案: