【问题标题】:How to populate a column using multiple conditionals across 2 dataframes?如何使用跨 2 个数据帧的多个条件填充列?
【发布时间】:2020-02-11 08:26:55
【问题描述】:

我正在尝试使用基于两个单独数据帧中的两个条件的值填充列。所以,

df1$day == df2$day & df1$hour == df2$hour 然后用 df2$depth 填充 df1$X

我很挣扎,因为我没有要求它用通用值填充它(即如果 x==y,则 y2=1)。我试图让它跨多行选择值。一个模拟示例:

df1                         df2
day   hour   X              day  hour   depth 
1      10    NA             1    10     50
1      11    NA             1    11     10
2      5     NA             1    3      100
5      9     NA             5    9      50
6      20    NA             7    17     80
7      17    NA             10    4     65

任何帮助将不胜感激。

【问题讨论】:

    标签: r conditional-statements


    【解决方案1】:

    更简单的选择是从data.table 加入

    library(data.table)
    setDT(df1)[df2, X := depth, on = .(day, hour)]
    df1
    #   day hour  X
    #1:   1   10 50
    #2:   1   11 10
    #3:   2    5 NA
    #4:   5    9 50
    #5:   6   20 NA
    #6:   7   17 80
    

    base R中,我们可以使用match

    df1$X <- with(df1, df2$depth[match(paste(day, hour), paste(df2$day, df2$hour))])
    

    数据

    df1<- data.frame(day = c(1, 1, 2, 5:7), hour = c(10:11, 5, 9, 20, 17),
             X = NA_integer_)
    df2 <- data.frame(day = c(1, 1, 1, 5, 7, 10), hour = c(10, 11, 3, 9, 
           17, 4), depth = c(50, 10, 100, 50, 80, 65))
    

    【讨论】:

      【解决方案2】:

      使用dplyr,我们可以做一个left_join 然后rename depth 列作为X

      library(dplyr)
      left_join(df1, df2, by = c("day", "hour")) %>%
         select(-X) %>%
         rename(X = depth)
      
      #  day hour  X
      #1   1   10 50
      #2   1   11 10
      #3   2    5 NA
      #4   5    9 50
      #5   6   20 NA
      #6   7   17 80
      

      如果X 列并不总是NA,您可以使用coalesce

      left_join(df1, df2, by = c("day", "hour")) %>%
         mutate(X = coalesce(depth, X)) %>%
         select(names(df1))
      

      或者在基础 R 中:

      merge(df1, df2, all.x = TRUE)[-3]
      

      【讨论】:

        猜你喜欢
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-20
        • 2013-04-02
        相关资源
        最近更新 更多