我有几个名为y2010,y2011,y2012,......的帧和一个名为z的帧。 “firstcolumn”包含拟合名称。 我想在循环中将left_join的每个帧(y2010,y2011,y2012,...)的内容与z匹配。
for(i in 2010:2017) {
z<-left_join(z, paste0("y", 2011) , by="firstcolumn")
}
但我无法通过paste0选择y2010,y2011,y2012,...框架。 我该怎么办?
答案 0 :(得分:1)
使用get
:
z <- left_join(z, get(paste0("y", 2011)), by="firstcolumn")
答案 1 :(得分:1)
要避免使用for循环,您可以使用mget
将它们放入列表中,lapply
放入merge
,
library(dplyr)
lapply(mget(ls(pattern = 'y[0-9]+')), function(i) left_join(z, i, by = 'firstcolumn'))
答案 2 :(得分:1)
听起来你可能也想看Reduce
:
Reduce(function(x, y) left_join(x, y, by = "firstcolumn"),
mget(c("z", paste0("y", 2010:2017))))
提供一些样本数据和预期输出总是更好。以下是一些示例数据:
ls() ## Just to show I'm starting with nothing in my workspace
# character(0)
set.seed(1)
list2env(setNames(replicate(9, data.frame(firstcolumn = sample(letters[1:5], 3), data = sample(10, 3, TRUE), stringsAsFactors = FALSE), FALSE), c("z", paste0("y", 2010:2017))), .GlobalEnv)
ls()
# [1] "y2010" "y2011" "y2012" "y2013" "y2014" "y2015" "y2016" "y2017" "z"
以下是使用Reduce
使用for
循环的比较:
library(dplyr)
Reduce(function(x, y) left_join(x, y, by = "firstcolumn"),
mget(c("z", paste0("y", 2010:2017))))
# firstcolumn data.x data.y data.x.x data.y.y data.x.x.x data.y.y.y data.x.x.x.x
# 1 b 10 2 8 3 4 7 NA
# 2 e 3 1 NA NA 9 9 NA
# 3 d 9 NA 5 7 NA NA 5
# data.y.y.y.y data
# 1 5 3
# 2 NA NA
# 3 8 9
usingGet <- function() {
for(i in 2010:2017) {
z <- left_join(z, get(paste0("y", i)) , by="firstcolumn")
}
z
}
# firstcolumn data.x data.y data.x.x data.y.y data.x.x.x data.y.y.y data.x.x.x.x
# 1 b 10 2 8 3 4 7 NA
# 2 e 3 1 NA NA 9 9 NA
# 3 d 9 NA 5 7 NA NA 5
# data.y.y.y.y data
# 1 5 3
# 2 NA NA
# 3 8 9