【问题标题】:Merge more than 2 dataframes together depending on column value in R根据 R 中的列值将超过 2 个数据帧合并在一起
【发布时间】:2020-03-12 02:02:05
【问题描述】:

我想根据两列中的值将一个数据框与多个数据框合并。我知道我可以使用 merge() 函数基于列中的一个元素合并两个数据帧,但是当数据帧超过 2 个时我不知道该怎么做。

例如,以此为主要数据框:

yr.col <- c(rep("2018",3), rep("2017",4), rep("2016",5))
mnth.col <- sample.int(4,12, replace = TRUE)
lon <- c(paste(1:12,"x"))
lat <- c(paste(1:12,"y"))

df <- data.frame(yr.col,lon,lat)

这些是其他数据帧,它们具有不同年份的 lon 和 lat 集合的温度。

tmp_18 <- sample.int(8,12,replace = TRUE)
tmp_17 <- sample.int(8,12,replace = TRUE)
tmp_16 <- sample.int(8,12,replace = TRUE)

env_18 <- data.frame(tmp_18,lon,lat)
env_17 <- data.frame(tmp_17, lon, lat)
env_16 <- data.frame(tmp_16, lon, lat)

目标:我想将dfenv_18 env_17env_16 合并,具体取决于df$yr.col

预期结果:一个数据框,其中包含一个名为 tmp 的新列,其中找到了来自正确 env 数据集的数字

以前尝试过:

1)

if (df$yr.col=="2018"){
  df.new$tmp <- merge(df,env_18, by=c("lon", "lat"))
  df.new$tmp.yr <- "2018"
}else if (df$yr.col=="2017"){
  df.new$tmp <- merge(df, env_17, by=c("lon", "lat"))
  df.new$tmp.yr <- "2017"
} else {
  df.new$tmp <- merge(df, env_16, by=c("lon", "lat"))
  df.new$tmp.yr <- "2016"}

产生此警告:

Warning message:
In if (df$yr.col == "2018") { :
  the condition has length > 1 and only the first element will be used

它只取第一个数据帧 env_18 并将其与 df 合并

我也试过 2)

df.new <- ifelse(df$yr.col=="2018", merge(df, env_18, by=c("lon", "lat")), 
                       ifelse(df$yr.col=="2017", merge(df, env_17, by=c("lon", "lat")),
                              ifelse(df$yr.col=="2016", merge(df, env_16, by=c("lon", "lat")), "NA")))
df.new <- data.frame(matrix(unlist(df.new), nrow=length(df.new)))

但这并没有给出预期的结果。

是否有一些我没有考虑过或犯了错误的神奇方法来做到这一点?也许是for-loopfunction
非常感谢您提前提供的帮助!我真的很感激:))

【问题讨论】:

    标签: r dataframe for-loop if-statement merge


    【解决方案1】:

    您可以为此使用dplyrpurrr。我本来可以使用inner_join,但决定保留merge,就像原来的帖子一样。

    map2_dfr(list(env_16, env_17, env_18),
                    2016:2018,
                    function(x,y){merge(df %>% filter(yr.col == y), x, by=c("lon", "lat"))})
    

    输出

    lon  lat yr.col tmp_16 tmp_17 tmp_18
    1  10 x 10 y   2016      1     NA     NA
    2  11 x 11 y   2016      8     NA     NA
    3  12 x 12 y   2016      7     NA     NA
    4   8 x  8 y   2016      7     NA     NA
    5   9 x  9 y   2016      2     NA     NA
    6   4 x  4 y   2017     NA      5     NA
    7   5 x  5 y   2017     NA      4     NA
    8   6 x  6 y   2017     NA      8     NA
    9   7 x  7 y   2017     NA      7     NA
    10  1 x  1 y   2018     NA     NA      6
    11  2 x  2 y   2018     NA     NA      2
    12  3 x  3 y   2018     NA     NA      1
    

    您也可以从tmps 创建一列并删除其余列:

    df$tmp <- coalesce(df$tmp_16, df$tmp_17, df$tmp_18)
    

    【讨论】:

    • 非常感谢您的帮助 - 它有效!我只需要确保我将map2_dfr 调用到一个新的数据帧中,然后再打开coalesce()。您提到inner_join,出于兴趣,我该怎么做?
    • 另外请我确认filter(yr.col==y)在功能位中的作用?再次感谢您
    • @EveTC inner_joinmerge 的作用相同,只是来自不同包 (dplyr) 的函数。 filter (yr.col==y) 对给定 y 的原始数据框进行子集化 - 换句话说,根据年份对其进行过滤
    猜你喜欢
    • 2017-12-30
    • 1970-01-01
    • 2013-06-14
    • 2022-11-28
    • 2020-09-04
    • 1970-01-01
    • 2022-01-20
    • 2019-08-10
    • 1970-01-01
    相关资源
    最近更新 更多