【问题标题】:Loop rename variables in R with assign()使用assign()循环重命名R中的变量
【发布时间】:2016-09-28 08:35:05
【问题描述】:

我正在尝试在多个数据帧上重命名变量,但分配不起作用。这是我正在尝试的代码

assign(colnames(eval(as.name(DataFrameX)))[[3]], "<- NewName")
# The idea is, go through every dataset, and change the name of column 3 to
# "NewName" in all of them

这不会返回任何错误(我能想到的所有其他版本都返回了某种错误),但它也不会更改变量名。

我正在使用循环来创建多个数据框和每个变量中的不同变量,现在我需要重命名其中一些变量,以便稍后可以将数据框合并为一个。一切正常,除了重命名。如果我在使用colnames(DF)[[3]] &lt;- "NewName" 的常规调用中为自己输入数据框和变量的名称,但不知何故,当我尝试使用 assign 以便它在循环中完成时,它什么也不做。

【问题讨论】:

  • 您有listdata frame 吗?或者你有几个data frame的变量的class是什么?
  • 它们不在列表中,也不在任何其他变量下。它们都是独立的、独立的数据框(我已经看到,显然最好的方法是使用数据框列表,但如果没有它们,我将不胜感激)
  • 感谢所有答案,但如果有人能告诉我为什么 assign 调用不起作用,那也很好
  • 阅读help("assign")。目前尚不清楚您对代码的推理是什么以及为什么您认为它应该起作用。此外,出于充分的理由,建议使用列表。不要让你的编码生活变得比需要的更难。

标签: r loops rename assign


【解决方案1】:

您可以在您的环境中对所有data frames 执行循环操作。由于您只是在环境中寻找data frame,因此您可以避免接触任何其他变量的风险。关键是您应该对循环内的每个data frame assign 进行新的更改。

df1 <- data.frame(q=1,w=2,e=3)
df2 <- data.frame(q=1,w=2,e=3)
df3 <- data.frame(q=1,w=2,e=3)

# > df1
  # q w e
# 1 1 2 3
# > df2
  # q w e
# 1 1 2 3
# > df3
  # q w e
# 1 1 2 3

DFs=names(which(sapply(.GlobalEnv, is.data.frame)))
for (i in 1:length(DFs)){
    df=get(paste0(DFs[i]))
    colnames(df)[3]="newName"
    assign(DFs[i], df)
}

# > df1
  # q w newName
# 1 1 2       3
# > df2
  # q w newName
# 1 1 2       3
# > df3
  # q w newName
# 1 1 2       3

【讨论】:

  • 谢谢!我在工作区上确实有其他数据框,因此为了节省工作量,我将尝试重新编写它,以便它只调用具有特定命名结构的数据框,但其余的都是这样做的
  • 在这种情况下,您可以使用grep 和您想要的regex 模式过滤掉DFs。即DFs=grep("regex pattern wanted", DFs, value = TRUE)
【解决方案2】:

我们可以尝试?eapply()setnames()data.table 包应用到您全球环境中的所有data.frame。

library(data.table)
eapply(.GlobalEnv, function(x) if (is.data.frame(x)) setnames(x, 3, "NewName"))

【讨论】:

  • 我的环境中有很多其他变量和数据框,我宁愿不做任何可能触及它们的事情,但我会尝试 `setnames'
  • 为什么不把相关的data.frames保存在一个列表中,然后使用lapply呢?
  • 我也会更新你的问题,因为目前你说#The idea is, go through every dataset,因此eapply 方法。
猜你喜欢
  • 2016-11-13
  • 2014-06-17
  • 2018-12-07
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多