代码之家  ›  专栏  ›  技术社区  ›  ruggntub

按其他两列中的位置将数据添加到r中的一列中

  •  0
  • ruggntub  · 技术社区  · 3 年前

    我有一个站点和日期的数据框架:

    dat<-data.frame(Site = rep(c('a', 'b', 'c', 'd', 'e'),each = 5),
                  Date = rep(c(1,2,3,4,5),5))
    

    我使用for循环来下载基于网站和日期的流量数据。在循环的下一次迭代之前,我想将站点日期条目的流数据附加到此数据帧中。我可以这样做:

    # example flow data
    
    q1<-data.frame(Site = rep(c('a'),5),
                  Date = c(1,2,3,4,5),
                  dailyQ = c(NA, 70, 65, NA, 41))
    
    # left join to add flow data
    
    library(dplyr)
    
    dat<-left_join(dat,q1,by = c("Site" = "Site", "Date" = "Date"))
    
    

    然而,在下一次迭代中,此方法将为dailyQ创建一个新列:

    # next loop iteration flow dataframe 
    
    q2<-data.frame(Site = rep(c('b'),5),
                   Date = c(1,2,3,4,5),
                   dailyQ = c(43, 55, NA, NA, 72))
    
    # appending next flow data into existing dataframe
    
    dat<-left_join(dat,q2,by = c("Site" = "Site", "Date" = "Date"))
    
    # >names(dat)
    
    # [1] "Site"     "Date"     "dailyQ.x" "dailyQ.y"
    

    我想要的是在每次迭代中将这些新条目附加到同一列中。我看了文件 *_join 对于stackoverflow的问题,却找不到解决方案。我知道我可以用嵌套 for 循环,但我正在寻找一个更优雅的解决方案。也许解决方案在于一种不同的方法,任何帮助都将不胜感激。非常感谢。

    1 回复  |  直到 3 年前
        1
  •  1
  •   Jon Spring    3 年前
    library(dplyr)
    dat %>%
      left_join(q1) %>%
      rows_update(q2, by = c("Site", "Date"))
    

    这个 left_join 步骤添加了 dailyQ 变量 rows_update 将在不添加新变量的情况下更新匹配的行,相当于:

    dat %>%
      left_join(q1) %>%
      left_join(q2, by = c("Site", "Date")) %>%
      transmute(Site, Date, dailyQ = coalesce(dailyQ.y, dailyQ.x))
    
    推荐文章