根据R中的列值将2个以上的数据帧合并在一起
我希望根据两列中的值将一个数据帧与多个数据帧合并。我知道我可以使用根据R中的列值将2个以上的数据帧合并在一起,r,dataframe,for-loop,if-statement,merge,R,Dataframe,For Loop,If Statement,Merge,我希望根据两列中的值将一个数据帧与多个数据帧合并。我知道我可以使用merge()函数基于列中的一个元素合并两个数据帧,但我不知道当有两个以上的数据帧时如何合并 例如,将其作为主要数据帧: 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
merge()
函数基于列中的一个元素合并两个数据帧,但我不知道当有两个以上的数据帧时如何合并
例如,将其作为主要数据帧:
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)
产生以下警告:
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您可以使用dplyr
和purrr
。我本可以使用internal\u-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
您还可以从tmp
s创建一列,并删除其余的列:
df$tmp <- coalesce(df$tmp_16, df$tmp_17, df$tmp_18)
df$tmp非常感谢您的帮助-非常有效!我只需要确保我将map2\u-dfr
调用到一个新的数据帧中,然后coalesce()
打开。您提到内部连接
,出于兴趣,我将如何这样做?另外,我可以了解过滤器(yr.col==y)
在函数位中的作用吗?非常感谢。again@EveTCinternal\u join
的作用与merge
相同,只是来自不同包(dplyr
)的一个函数filter(yr.col==y)
为给定的y
子集原始数据帧-换句话说,根据年份对其进行过滤
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
df$tmp <- coalesce(df$tmp_16, df$tmp_17, df$tmp_18)