【问题标题】:value name as string in assign function值名称作为分配函数中的字符串
【发布时间】:2015-08-08 21:32:33
【问题描述】:

我想在一个循环中使用不同的数据帧。我无法访问循环中的不同数据帧。

Data1<-data.frame(X=rnorm(100,2), Y=rnorm(200,2), Z=rnorm(200,2))
Data2<-data.frame(X=rnorm(300,500), Y=rnorm(300,500))
Data3<-data.frame(X=rnorm(500,200), Y=rnorm(20,200))

for (i in c(1:3)){
assign("CurrentData", paste("Data", i, sep=""))
colMeans(CurrentData)
}

assign 函数没有执行我想要的操作,因为它认为第二个参数是字符串而不是对象的名称。我该如何解决这个问题?

【问题讨论】:

  • 嗯,现在是一个字符串,不是吗? (我认为你勾选了错误的答案。使用get() 而不是eval(as.name(...)) 被认为更符合典型做法。)通常不建议新手使用eval 来解决困难。)使用objname&lt;-list(Data1=data.frame(X=rnorm(100,2), Y=rnorm(200,2), Z=rnorm(200,2)), Data2 = ...) 的列表
  • 嗨,我检查了我认为最直观的答案,它对我的​​数据很有用。

标签: r string object assign


【解决方案1】:

?assign

它是assign(x, value),其中x 是变量名,value 是要分配给该变量名的对象

目前,你有这个:

...
assign("CurrentData", paste("Data", i, sep=""))
## This is equivalent to: CurrentData <- "Data1" 
... 

您正在为 CurrentData 分配 字符串值:“Data1”、“Data2”、“Data3”,但不是同名对象本身的值。

尝试使用?get。像这样:

...
assign("CurrentData", get(paste("Data",i,sep="")))
...

奖励:

为此,您最好使用colMeans(x)

【讨论】:

    【解决方案2】:

    你的assign语句需要是这样的

    assign("CurrentData", eval(as.name(paste("Data", i, sep="")))
    

    as.name 的调用将字符串转换为符号名称,然后eval 实际获取符号的值。

    还有其他方法可以做到,但这清楚地表达了意图。

    实现你想要的更简单的方法是这样

    Data1<-data.frame(X=rnorm(100,2), Y=rnorm(200,2), Z=rnorm(200,2))
    Data2<-data.frame(X=rnorm(300,500), Y=rnorm(300,500))
    Data3<-data.frame(X=rnorm(500,200), Y=rnorm(20,200))
    
    for (CurrentData in list(Data1, Data2, Data3)){
        somefunction(CurrentData)
    }
    

    请注意,我使用list 来避免将所有数据帧强制转换为一个大向量。

    【讨论】:

    • 这是错误的。不再有mean.data.frame。 (几个版本前已删除。)for 循环内的计算不会打印或返回。然后总是有fortunes::fortune("parse")
    • 好吧,无论如何,其中之一::fortunes::fortune(106)。一个奇迹是 showMatches 的添加是由“解析”命中的扩散推动的:fortunes::fortune("parse", showMatches = TRUE)
    • 不想过多更改 OP" 的代码,我确实提到了 mean 的问题。否则,我会使用 lapply 提出一些东西
    • 不应该尊重错误的代码......而应该更正它。
    • 您好,我已将平均语句编辑为 colMeans。这更多地表明我将在循环中进行一些分析/建模,而不是我遇到困难的事情。
    猜你喜欢
    • 1970-01-01
    • 2015-03-09
    • 2013-09-16
    • 1970-01-01
    • 2019-11-23
    • 2018-12-03
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    相关资源
    最近更新 更多