【问题标题】:R rename variables in loop with names()R用名称()在循环中重命名变量
【发布时间】:2016-11-13 15:47:08
【问题描述】:

在 R 中,我有几个具有相同结构的数据框(3 列和几行)。所有数据框都遵循相同的命名约定并具有相同的数据结构,因此可以使用ls(pattern="NamePrefix") 调用列出它们。

我想使用 for 循环来重命名所有这些数据帧的第二个和第三个变量。这是我尝试过的代码:

for (i in ls(pattern="NamePrefix"))
{
    names(i)[[2]] <- "NewName"
    names(i)[[3]] <- "OtherNewName"
}

我也尝试将数据框的名称设置为列表(File_List &lt;- ls(pattern="NamePrefix")),然后在循环中使用该列表(for (i in File_List)),但这也不起作用。

无论我做什么,我都会收到此错误:

Error in names(i)[[2]] <- "NewName" :
'names' attribute [2] must be the same length as the vector [1]

但是,如果我只是简单地做names(SomeDataset)[[2]] &lt;- "NewName",那效果很好。然而不知何故,for 循环似乎无法运行它。

关于它为什么会发生以及如何解决它的任何想法?请注意,我很清楚其他几种替代方法可以在不使用names() 的情况下对多个数据帧进行相同的循环重命名,但这是一种更简单、更直观的替代方法(我认为),我不明白为什么循环似乎无法实施。所以,现在我想了解为什么我认为最简单的解决方案似乎是错误的(如果可能,如何修复它以使其正常工作)。

提前致谢!

【问题讨论】:

  • 首先,使用names(df)[2] &lt;- "someName" 不要使用[[,因为它用于访问列表项。将相似的 data.frames 存储在列表中通常是有利的。请参阅this post,了解如何将 data.frames 放入列表中。特别是,gregor's answer there 提供了许多有用的方法来处理列表中的 data.frames。
  • 感谢您的提示,以及对[[ 使用的澄清
  • 我应该澄清[[ 在技术上大部分时间都适用于向量,但它可能会导致意想不到的后果,例如从向量中剥离属性。所以使用[ 通常是你想要做的。 [[ 在处理列表时非常有用。

标签: r for-loop dataframe rename


【解决方案1】:

因为i 将是一个字符对象命名对象,而不是对象本身。我实际上想不出一个好的方法来做到这一点。 “我如何对一堆名称相似的对象执行 xxxx?”的一般建议是“将这些对象存储在列表中”...

dd <- data.frame(a=1,b=2,c=3)
for (i in ls(pattern="^dd")) {
    g <- get(i)
    names(g)[2:3] <- c("NewName","OtherNewName")
    assign(i,g)
}

可能还有一个基于(呃)eval(parse(...))的解决方案

【讨论】:

  • 操作,我没有按时看到你的解决方案。很抱歉发布了这样一个类似的答案。
  • 你的更简单。我的答案的唯一优势是顶部的解释/建议。
  • (我现在已经精简了我的...)
  • 我看得出来你玩得很开心 kkkk。 =)
  • 感谢您的解释和解决方案!这些正是我所期待的,现在我知道出了什么问题。
【解决方案2】:
#Creating data frames
df1 <- data.frame("V1"=rnorm(10,1,10),"V2"=rnorm(10,1,10),"V3"=rnorm(10,1,10))
df2 <- data.frame("V1"=rnorm(10,1,10),"V2"=rnorm(10,1,10),"V3"=rnorm(10,1,10))
df3 <- data.frame("V1"=rnorm(10,1,10),"V2"=rnorm(10,1,10),"V3"=rnorm(10,1,10))
df4 <- data.frame("V1"=rnorm(10,1,10),"V2"=rnorm(10,1,10),"V3"=rnorm(10,1,10))
df5 <- data.frame("V1"=rnorm(10,1,10),"V2"=rnorm(10,1,10),"V3"=rnorm(10,1,10))

# Creating a list of data frames
df_list <- ls(pattern="df")

# Renaming the variables in the data frame
for(i in df_list){
  aux <- get(i)
  names(aux)[2:3] <- c("Vari2","Vari3")
  assign(i,aux)
}

【讨论】:

    猜你喜欢
    • 2014-06-17
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2019-01-31
    • 2019-07-05
    • 2018-12-07
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多