Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据R中的列值将2个以上的数据帧合并在一起_R_Dataframe_For Loop_If Statement_Merge - Fatal编程技术网

根据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@EveTC
internal\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)