【发布时间】:2021-05-22 01:27:55
【问题描述】:
我试图弄清楚如何合并/连接两个数据帧,如果满足某个条件,R 将两个数据帧中的两行合并为一行,但如果条件不满足, R 在原始数据框中不存在的列中添加一个新行,其中包含 NA。我不清楚这是否比我想象的更简单,但我一直无法弄清楚如何做到这一点,即使在阅读了一些堆栈溢出结果(e.g. 或e.g.)之后。
以下是两个示例数据框:
df1 <- data.frame(Name_df1 = c("Alan", "Steve", "Melanie", "Steve", "Melanie"),
Date_df1 = c("02/18/2008", "02/18/2008", "03/14/2009", "04/19/2009", "03/16/2009"),
Job_df1 = c("Cook", "Security", "Greeter", "Security", "Greeter"),
Hours_df1 = c(8.5, 7.0, 6.0, 7.0, 6.0))
df2 <- data.frame(Name_df2 = c("Steve", "Alan", "Melanie", "Melanie", "Steve", "Carter"),
Date_df2 = c("02/18/2008", "02/18/2008", "03/14/2009", "03/17/2009","04/25/2009", "08/15/2011"),
Job_df2 = c("Police", "Chef", "Greeter", "Greeter", "Security", "Doorman"),
Hours_df2 = c(8.5, 7.0, 6.0, 7.0, 7.0, 6.5),
Wage_df2 = c(80, 77, 127.5, 90, 145, 100))
df1 和 df2 都描述了某些个人的工作日期、他们的职位、姓名和在指定日期的工作时间,仅 df2 还包含工资信息。我想要做的是将 df1 和 df2 加入到具有以下列的 df3 中:
- “Name_df1”
- “名称_df2”
- “日期_df1”
- “日期_df2”
- “Job_df1”
- “Job_df2”
- “Hours_df1”
- “Hours_df2”
- “Wage_df2”
具体来说,我想加入 df1 和 df2,这样对于 df1 或 df2 中的每一行,如果 both 与“Name_df1”/“Name_df2”列中的值完全匹配,并且相对数据框中相应列中的“Date_df1”/“Date_df2”列中的值(即在 df1 中,如果“Date_df1”列和“Name_df1”列中的值在“Date_df2”中都具有完全匹配df2) 的列和“Name_df2”列:
- 在 df3 中创建了一行,其中填充了“Name_df1”、“Name_df2”、“Date_df1”、“Date_df2”、“Job_df1”、“Job_df2”、“Hours_df1”、“Hours_df2”和“Wage”列与来自 df1 和 df2 的相关值。 “Job_df1”、“Job_df2”、“Hours_df1”和“Hours_df2”中的值可能相同,也可能不同。
但是,如果不完全匹配both“Name_df1”/“Name_df2”列中的值和“Date_df1”/”中的值Date_df2" 列,然后 df3 应该得到一行,其中仅包含来自“Name_df1”、“Date_df1”、“Job_df1”和“Hours_df1”中的 df1 的信息,以及“Name_df2”、“Date_df2”、“Job_df2”中的 NAs, “Hours_df2”和“Wage_df2”。或者,如果原始行来自 df2,则 df3 应获取仅包含“Name_df2”、“Date_df2”、“Job_df2”、“Hours_df2”和“Wage_df2”中来自 df2 的信息以及“Name_df1”中的 NA 的行"、"Date_df1"、"Job_df1" 和 "Hours_df1"。
我知道这很拗口,但根据上面指定的 df1 和 df2,这就是 df3 的样子:
df3 <- data.frame(Name_df1 = c("Alan", "Steve", "Melanie", "Steve", "Melanie", NA, NA, NA),
Name_df2 = c("Alan", "Steve", "Melanie", NA, NA, "Melanie", "Steve", "Carter"),
Date_df1 = c("02/18/2008", "02/18/2008", "03/14/2009", "04/19/2009", "03/16/2009", NA, NA, NA),
Date_df2 = c("02/18/2008", "02/18/2008", "03/14/2009", NA, NA, "03/17/2009", "04/25/2009", "08/15/2011"),
Job_df1 = c("Cook", "Security", "Greeter", "Security", "Greeter", NA, NA, NA),
Job_df2 = c("Chef", "Police", "Greeter", NA, NA, "Greeter", "Security", "Doorman"),
Hours_df1 = c(7.0, 7.0, 6.0, 7.0, 6.0, NA, NA, NA),
Hours_df2 = c(7.0, 8.5, 6.0, NA, NA, 7.0, 7.0, 6.5),
Wage_df2 = c(77.0, 80, 127.5, NA, NA, 90.0, 145.0, 100))
谁能帮我解决这个问题?
【问题讨论】:
-
'我如何有条件地组合一些行(但不是其他行)'你没有。交叉连接给出每个表中一行的所有组合,然后保留满足条件的组合。了解加入的基础知识。
-
我知道交叉连接,只是不确定这些特定条件的过滤会是什么样子
标签: r join dplyr merge conditional-statements