如何从存在多个匹配行的另一个数据框中添加列

时间:2020-04-14 14:45:32

标签: r dataframe

我是R的新手,被困住了。

NB!很抱歉,我无法在示例中弄清楚如何在数字和标题之间添加1个以上的空格,所以我改用“ _”。

问题:

我有两个数据帧(毕业和职业)。我想将职业与毕业证书相匹配。困难的部分是,一个人可能在两个数据框中都出现多次,而我想保留所有数据。

示例:

毕业

一个人可能已经完成了许多课程。原始DF有更多列,但与示例无关。

Person_ID__curriculum_ID__学校ID
___1___________100__________10
___2___________100__________10
___2___________200____________10
___3___________300__________12
___4___________100__________10
___4___________200__________12

职业

不是所有毕业生都有工作,DF中的每个人都应该只有一个主要工作(JOB_Type代码“ 1”),并且可以有0-5个额外的工作(JOB_Type代码“ 0”)。原始DF有更多列,但当前不相关。

Person_ID ___ JOB_ID_____JOB_Type
___1_________1223________1
___3___________3334__________1
___3_________2120________0
___3_________7843________0
___4_________4522________0
___4_________1240________1

最终结果:

名为“结果”的新DF包含第一个DF(毕业)的所有毕业信息以及第二个DF(职业)的添加列。

请注意,人“ 2”不在职业DF中。他们的数据保留,但添加的列保留为空。

请注意,人“ 3”有多个工作,因此添加了多余的重复行。

请注意,如果“ 4”人同时有多个工作和毕业,则添加了额外的行以适合所有数据。

新DF:“结果”
Person_ID__课程ID_School_ID___JOB_ID____JOB_Type
___1___________100__________10_________1223________1
___2___________100__________10
___2___________200____________10
___3___________300__________12_________3334________1
___3___________300__________12_________2122________0
___3___________300__________12_________7843________0
___4___________100__________10_________4522________0
___4___________100__________10_________1240________1
___4___________200__________12_________4522________0
___4___________200__________12_________1240________1

对我来说,最困难的部分是如何使R添加额外的重复行。我环顾四周,以查找有关类似内容但可能的示例或教程。可能我没有使用正确的关键字。

如果能给我示例如何编写代码,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以像使用merge

merge(Graduations, Occupations, all.x=TRUE)
#   Person_ID curriculum_ID School_ID JOB_ID JOB_Type
#1          1           100        10   1223        1
#2          2           100        10     NA       NA
#3          2           200        10     NA       NA
#4          3           300        12   3334        1
#5          3           300        12   2122        0
#6          3           300        12   7843        0
#7          4           100        10   4522        0
#8          4           100        10   1240        1
#9          4           200        12   4522        0
#10         4           200        12   1240        1

数据:

Graduations  <- read.table(header=TRUE, text="Person_ID  curriculum_ID School_ID
   1           100          10
   2           100          10
   2           200          10
   3           300          12
   4           100          10
   4           200          12")

Occupations  <- read.table(header=TRUE, text="Person_ID   JOB_ID    JOB_Type
   1         1223        1
   3         3334        1
   3         2122        0
   3         7843        0
   4         4522        0
   4         1240        1")

答案 1 :(得分:1)

带有left_join

的选项
library(dplyr)
left_join(Graduations, Occupations)