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

我如何有条件地组合R数据帧中的某些行(而不是其他行)?

公冶经纶
2023-03-14

我试图弄清楚如何合并/连接两个数据帧,这样做的方式是:如果满足某一条件,R将两个数据帧中的两行合并成一行,但如果不满足该条件,R在原始数据帧中不存在的列中添加一个带有NAs的新行。我不清楚这是否是一个比我想象的更简单的连接,但我一直无法弄清楚如何做到这一点,甚至在阅读了一些堆栈溢出结果(例如或例如)之后。

下面是两个示例数据帧:

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))
    null
  • 在df3中创建一行,其中“name_df1”、“name_df2”、“date_df1”、“date_df2”、“job_df1”、“job_df2”、“hours_df1”、“hours_df2”和“way”列用df1和DF2中的相关值填充。“job_df1”、“job_df2”、“hours_df1”和“hours_df2”中的值可能相同,也可能不同。

但是,如果“name_df1”/“name_df2”列中的值和“date_df1”/“date_df2”列中的值不完全匹配,则df3应该获得一个行,该行仅包括来自“name_df1”、“date_df1”、“job_df1”和“hours_df1”中的df1的信息,以及来自“name_df2”、“date_df2”、“job_df2”、“hours_df2”和“wage_df2”中的NAs的信息。或者,如果原始行来自df2,那么df3应该获得一个仅包括来自“NAME_DF2”、“DATE_DF2”、“JOB_DF2”、“HOURS_DF2”和“WAGE_DF2”中的df2的信息,以及“NAME_DF1”、“DATE_DF1”、“JOB_DF1”和“HOURS_DF1”中的NAs的信息的行。

我知道这是一个嘴巴,但基于上面指定的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))

有人能帮我吗?

共有1个答案

乐正锦
2023-03-14

您似乎正在查找full_join,但要获得所需的准确输出(DF3),需要执行一些操作。

library(dplyr)

full_join(df1, df2, by = c('Name_df1' = 'Name_df2', 'Date_df1' = 'Date_df2')) %>%
  mutate(Name_df2 = ifelse(is.na(Job_df2), NA, Name_df1),
         Name_df1 = ifelse(is.na(Job_df1), NA, Name_df1), 
         Date_df2 = ifelse(is.na(Job_df2), NA, Date_df1),
         Date_df1 = ifelse(is.na(Job_df1), NA, Date_df1)) %>%
  select(starts_with('Name'), starts_with('Date'), starts_with('Job'), everything())

#  Name_df1 Name_df2   Date_df1   Date_df2  Job_df1  Job_df2 Hours_df1 Hours_df2 Wage_df2
#1     Alan     Alan 02/18/2008 02/18/2008     Cook     Chef       8.5       7.0     77.0
#2    Steve    Steve 02/18/2008 02/18/2008 Security   Police       7.0       8.5     80.0
#3  Melanie  Melanie 03/14/2009 03/14/2009  Greeter  Greeter       6.0       6.0    127.5
#4    Steve     <NA> 04/19/2009       <NA> Security     <NA>       7.0        NA       NA
#5  Melanie     <NA> 03/16/2009       <NA>  Greeter     <NA>       6.0        NA       NA
#6     <NA>  Melanie       <NA> 03/17/2009     <NA>  Greeter        NA       7.0     90.0
#7     <NA>    Steve       <NA> 04/25/2009     <NA> Security        NA       7.0    145.0
#8     <NA>   Carter       <NA> 08/15/2011     <NA>  Doorman        NA       6.5    100.0
 类似资料:
  • 我有一个pandas dataframe,我想在其中求和某些不规则间隔的日期之间的值。举个例子,我有这样的东西: 并且我知道这些总和的截止日期是2021-03-01、2021-03-04、2021-03-05,所以我想要截止日期和直到(但不包括)下一个截止日期产生的所有小部件的总和。所有不是截止日期的日期的值都为0。 这将产生如下所示的新列。 我怎么能在熊猫内部做到这一点呢?

  • 我试图用这个代码从一个较小的数据帧中制作一个数据帧: 这给了我一个新的数据帧,根据这些条件是否满足,可以使用True或False。我如何让它给我一个数据帧,其中包含满足这些条件的行?

  • 本文向大家介绍在某些情况下如何更改R数据帧中的列?,包括了在某些情况下如何更改R数据帧中的列?的使用技巧和注意事项,需要的朋友参考一下 有时,特定列的列值与另一列有某种关系,我们可能需要根据某些条件来更改该特定列的值。我们需要进行此更改,以检查列值的更改如何对所考虑的两个列之间的关系产生影响。在R中,我们可以使用单个方括号来更改列值。 示例 请看以下数据帧- 假设我们想从第2列(x2)值中减去2,

  • 本文向大家介绍如何基于R数据帧中其他变量的条件创建带有二进制变量的列?,包括了如何基于R数据帧中其他变量的条件创建带有二进制变量的列?的使用技巧和注意事项,需要的朋友参考一下 有时我们需要创建额外的变量以添加有关当前数据的更多信息,因为它可以增加值。这在我们进行特征工程时特别有用。如果我们了解可能影响响应的某些内容,那么我们更愿意将其用作数据中的变量,因此我们将其与已有的数据结合起来。例如,创建另

  • 我有一个不同长度的数据帧列表(df),按年份索引,数据的代理如下所示: