按动态名称选择数据框

时间:2017-08-11 07:15:11

标签: r loops left-join

我有几个名为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,...框架。 我该怎么办?

3 个答案:

答案 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