【问题标题】:How to join only certain rows using dplyr?如何使用 dplyr 仅加入某些行?
【发布时间】:2020-10-29 06:07:30
【问题描述】:

所以我有一个这样的数据框

ID     Date     TIME     var    Data     misc
1  1/3/2018  3:30 AM       a  string1  string1
1  4/23/2019 1:32 PM       b  string2  string1
1  1/3/2018  4:53 PM       c  string3  string1
2  1/4/2018  3:32 AM       d  string4  string2
2  3/3/2018  3:30 PM       s  string5  string2
2  3/3/2018  3:30 PM       e  string6  string2
3  4/23/2019 6:24 AM       w
3  4/23/2019 1:32 PM       s 
3  4/24/2019 3:20 PM       s
3  4/24/2019 3:20 PM       a

我想加入许多类似于Datamisc 的列来填充df,使用另一个由ID = 3 数据组成的df。

ID3_data

     DATE    Time       Data       misc
4/23/2019 6:24 AM    string7    stringA
4/23/2019 1:32 PM    string8    stringB
4/24/2019 3:20 PM    string9    stringC
4/24/2019 3:20 PM   string10    stringC

那么,我如何才能将我的 DF 与此 ID3_data 仅用于 ID =3 所在的行?

此外,还有另一个问题,我唯一的标识符是 DateTIME 但我确实有不同的匹配与相同的标识符,有没有办法说第一个实例去第一个和第二个第二???所以简而言之,最终的 DF 应该是这样的:

ID     Date     TIME     var     Data       misc
1  1/3/2018  3:30 AM       a   string1    string1
1  4/23/2019 1:32 PM       b   string2    string1
1  1/3/2018  4:53 PM       c   string3    string1
2  1/4/2018  3:32 AM       d   string4    string2
2  3/3/2018  3:30 PM       s   string5    string2
2  3/3/2018  3:30 PM       e   string6    string2
3 4/23/2019  6:24 AM       w   string7    stringA
3 4/23/2019  1:32 PM       s   string8    stringB
3 4/24/2019  3:20 PM       s   string9    stringC
3 4/24/2019  3:20 PM       a  string10    stringC

同样,优先级是加入选择行,但如果重复问题也可以使用 dplyr 一次性完成,那就太好了。

【问题讨论】:

    标签: r join dplyr tidyverse


    【解决方案1】:

    我们可以使用coalesce 进行连接。假设缺失值为NA

    library(dplyr)# 1.0.0
    left_join(DF, ID3_data %>%
               mutate(ID = 3), by = c('ID', 'Date' = 'DATE', 'TIME' = 'Time')) %>%
           mutate(Data = coalesce(Data.x, Data.y), misc = coalesce(misc.x, misc.y))
    

    或者如果有重复,那么一个选项是绑定两个数据集的行,然后通过 summarise 只使用非 NA 行进行分组(dplyr 1.0.0 允许 summarise 使用多个行)

    cbind(ID = 3, ID3_data) %>%
       set_names(names(DF)) %>% 
      bind_rows(DF) %>%
      group_by(ID, Date, TIME) %>% 
      summarise(across(everything(), ~ .[!is.na(.)]))
    # A tibble: 10 x 5
    # Groups:   ID, Date, TIME [8]
    #      ID Date      TIME    Data     misc   
    #   <dbl> <chr>     <chr>   <chr>    <chr>  
    # 1     1 1/3/2018  3:30 AM string1  string1
    # 2     1 1/3/2018  4:53 PM string3  string1
    # 3     1 4/23/2019 1:32 PM string2  string1
    # 4     2 1/4/2018  3:32 AM string4  string2
    # 5     2 3/3/2018  3:30 PM string5  string2
    # 6     2 3/3/2018  3:30 PM string6  string2
    # 7     3 4/23/2019 1:32 PM string8  stringB
    # 8     3 4/23/2019 6:24 AM string7  stringA
    # 9     3 4/24/2019 3:20 PM string9  stringC
    #10     3 4/24/2019 3:20 PM string10 stringC
    

    数据

    DF <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), 
        Date = c("1/3/2018", "4/23/2019", "1/3/2018", "1/4/2018", 
        "3/3/2018", "3/3/2018", "4/23/2019", "4/23/2019", "4/24/2019", 
        "4/24/2019"), TIME = c("3:30 AM", "1:32 PM", "4:53 PM", "3:32 AM", 
        "3:30 PM", "3:30 PM", "6:24 AM", "1:32 PM", "3:20 PM", "3:20 PM"
        ), Data = c("string1", "string2", "string3", "string4", "string5", 
        "string6", NA, NA, NA, NA), misc = c("string1", "string1", 
        "string1", "string2", "string2", "string2", NA, NA, NA, NA
        )), class = "data.frame", row.names = c(NA, -10L))
    ID3_data <- structure(list(DATE = c("4/23/2019", "4/23/2019", "4/24/2019", 
    "4/24/2019"), Time = c("6:24 AM", "1:32 PM", "3:20 PM", "3:20 PM"
    ), Data = c("string7", "string8", "string9", "string10"), misc = c("stringA", 
    "stringB", "stringC", "stringC")), class = "data.frame",
    row.names = c(NA, 
    -4L))
    

    【讨论】:

    • 忘记添加,变量名称不匹配。更新了 OP。
    • 还有几列(为重现性添加了数据和杂项)我需要为每一列写一个合并语句吗?
    • @JohnnyThomas 如果有几列,那么可以用pivot_longer自动完成
    • @JohnnyThomas 我注意到您有重复的日期、时间和 ID。在这种情况下,应该匹配哪一个
    • 没错,应该就是最终输出的样子。因此,第一次出现 DATE TIME 匹配时,获得最高匹配,然后下一次获得以下匹配。它只发生 3-4 次,很容易被抓住,所以我并不担心
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2011-09-14
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多