R-在循环中引用不同的数据帧

时间:2017-05-26 19:26:01

标签: r for-loop dataframe

我是R的新手,所以如果我想到这个完全错误,请随时告诉我。我有一系列关于发电厂的进口数据帧,每年一个(Plant1987,Plant1988等......),我试图最终合并到一个数据框架中。在此之前,我想添加一个"年"变量到每个数据帧。我可以为每个单独的数据帧执行此操作,但是希望将其正式化并一步完成。我知道如何在stata中做到这一点,但我在这里挣扎。

我正在思考以下几点:

for (y in 1987:2008) {
     paste("Plant",y,sep="")$year <- y
}

哪个不起作用,因为粘贴显然不是正确的功能。有一个聪明,快速的方法来做到这一点?谢谢

3 个答案:

答案 0 :(得分:1)

试试这个..

year=seq(1987,2008,by=1)
list_object_names = sprintf("Plant%s", 1987:2008)

list_DataFrame = lapply(list_object_names, get)

for (i in 1:length(list_DataFrame ) ){
    list_DataFrame[[i]][,'Year']=year[i]
}

答案 1 :(得分:0)

以下是一些代码可以为您提供一些想法。我使用mtcars数据帧作为示例来创建具有三个数据帧的列表。之后,我使用两个解决方案将年份(2000年至2002年)添加到每个数据框架。您需要修改数据的代码。

# Load the mtcars data frame
data(mtcars)

# Create a list with three data frames
ex_list <- list(mtcars, mtcars, mtcars)

# Create a list with three years: 2000 to 2002
year_list <- 2000:2002

解决方案1:使用基础R

中的lapply
ex_list2 <- lapply(1:3, function(i) {

  dt <- ex_list[[i]]

  dt[["Year"]] <- year_list[[i]]

  return(dt)
})

解决方案2:使用purrr

中的map2
library(purrr)    

ex_list3 <- map2(ex_list, year_list, .f = function(dt, year){

  dt$Year <- year

  return(dt)
})

ex_list2ex_list3是最终输出。

答案 2 :(得分:0)

我们假设你有data.frames

Plant1987 <- data.frame(plantID=1:4, x=rnorm(4))
Plant1988 <- data.frame(plantID=1:4, x=rnorm(4))
Plant1989 <- data.frame(plantID=1:4, x=rnorm(4))

您可以在

中添加$year
year <- 1987:1989
for(yeari in year) {
  eval(parse(text=paste0("Plant",yeari,"$year<-",yeari)))
}

Plant1987
#   plantID           x year
# 1       1  0.67724230 1987
# 2       2 -1.74773250 1987
# 3       3  0.67982621 1987
# 4       4  0.04731677 1987
# ...etc for other years...

...并使用

将它们绑定到一个data.frame中
df <- Plant1987
for(yeari in year[-1]) {
  df <- rbind(df, eval(parse(text=paste0("Plant",yeari))))
}

df
#    plantID            x year
# 1        1  0.677242300 1987
# 2        2 -1.747732498 1987
# 3        3  0.679826213 1987
# 4        4  0.047316768 1987
# 5        1  1.043299473 1988
# 6        2  0.003758675 1988
# 7        3  0.601255190 1988
# 8        4  0.904374498 1988
# 9        1  0.082030356 1989
# 10       2 -1.409670456 1989
# 11       3 -0.064881722 1989
# 12       4  1.312507736 1989

...或列在

列表中
itsalist <- list()
for(yeari in year) {
  eval(parse(text=paste0("itsalist$Plant",yeari,"<-Plant",yeari)))
}

itsalist
# $Plant1987
#   plantID           x year
# 1       1  0.67724230 1987
# 2       2 -1.74773250 1987
# 3       3  0.67982621 1987
# 4       4  0.04731677 1987
# 
# $Plant1988
#   plantID           x year
# 1       1 1.043299473 1988
# 2       2 0.003758675 1988
# 3       3 0.601255190 1988
# 4       4 0.904374498 1988
# 
# $Plant1989
#   plantID           x year
# 1       1  0.08203036 1989
# 2       2 -1.40967046 1989
# 3       3 -0.06488172 1989
# 4       4  1.31250774 1989