【发布时间】: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)
目标:我想将df 与env_18 env_17 或env_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-loop 或function?
非常感谢您提前提供的帮助!我真的很感激:))
【问题讨论】:
标签: r dataframe for-loop if-statement merge