【问题标题】:Create dynamically named objects in a for loop in R and assign dynamic values在 R 的 for 循环中创建动态命名的对象并分配动态值
【发布时间】:2021-02-06 15:19:46
【问题描述】:

我正在尝试使用 for 循环创建一组动态命名的新对象(例如,temp2015),并存储动态值 - 特别是其他对象的名称(例如,Y2015)和使用的值在 for 循环中(例如,2015) - 在动态命名的新对象中。

我不确定为什么下面的代码不起作用。

Y2015 = data.frame(VAR1 = 6:10, VAR2 = 1:5)
Y2016 = data.frame(VAR1 = 7:11, VAR2 = 11:15)
Y2017 = data.frame(VAR1 = 7:11, VAR3 = 5:9, VAR4 = 4:8)

for (i in 2015:2017) {
  paste0("temp", i) <- cbind(names(paste0("Y", i)), i)
}

all <- rbind(temp2015, temp2016, temp2017)

下面的代码得到了我想要的结果(特别是对象all_manual 中的数据内容),但这是在一个非常小的样本数据集上手动完成的,并不是一个长期的解决方案。

Y2015 = data.frame(VAR1 = 6:10, VAR2 = 1:5)
Y2016 = data.frame(VAR1 = 7:11, VAR2 = 11:15)
Y2017 = data.frame(VAR1 = 7:11, VAR3 = 5:9, VAR4 = 4:8)

all_manual = data.frame(file = c('VAR1', 'VAR2', 'VAR1', 'VAR2', 'VAR1', 'VAR3', 'VAR4'),
                 year = c(2015, 2015, 2016, 2016, 2017, 2017, 2017))

我非常感谢任何有关如何使其工作的建议或想法。

【问题讨论】:

  • 您要求的是使用assignget,您会发现很多反对使用这些功能:它们几乎总是表明设计不佳。由于帧看起来都一样,我建议您考虑使用list of frames:因为您可能对每个帧执行相同或相似的操作,所以使用lapply 可以大大简化代码的可维护性/灵活性.

标签: r


【解决方案1】:

您可以使用mgetstack

# creates a list of all objects with names starting with "Y" followed by 4 digits
l <- mget(x = ls(pattern = "^Y\\d{4}$"))

现在使用stack 根据该列表的名称和该列表包含的数据框的列名称创建一个数据框

out <- stack(sapply(l, names))

结果

out 
#  values   ind
#1   VAR1 Y2015
#2   VAR2 Y2015
#3   VAR1 Y2016
#4   VAR2 Y2016
#5   VAR1 Y2017
#6   VAR3 Y2017
#7   VAR4 Y2017

如果您想删除“Y”并将ind 变为数字,请尝试

out$ind <- as.numeric(sub("Y", "", out$ind))

更改列名

names(out) <- c("file", "year")
out
#   file year
#1 VAR1 2015
#2 VAR2 2015
#3 VAR1 2016
#4 VAR2 2016
#5 VAR1 2017
#6 VAR3 2017
#7 VAR4 2017

【讨论】:

    【解决方案2】:

    推荐的markus解决方案。但如果您希望使用 for 循环。

    for(i in 2015:2017){
      df <- get(paste("Y",i, sep = ""))
      df1 <- as.data.frame(cbind(colnames(df), i))
      if(i == lower_year){result <- df1} else{result <- rbind(result,df1)}
      }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 2014-11-06
      • 2018-08-20
      • 2021-07-29
      • 2017-06-19
      相关资源
      最近更新 更多