【问题标题】:Using string as object in R在 R 中使用字符串作为对象
【发布时间】:2015-03-06 16:25:11
【问题描述】:

我有变量a 作为字符串:

a = "jul_0_baseline,jul_1_baseline,...jul_11_baseline,jul_12_baseline"

当我尝试将以下动物园系列合并到一张表时:

temp <- merge(jul_0_baseline,jul_1_baseline,...jul_11_baseline,jul_12_baseline)

它有效,但是当我尝试使用合并它时

temp <- merge(a)

我收到一个错误,因为变量 a 是一个字符串(即使文本是正确的)。我假设它正在有效地输入

temp <- merge("jul_0_baseline,jul_1_baseline,...jul_11_baseline,jul_12_baseline")

任何帮助将不胜感激

a 是一个字符串,因为它是使用代码创建的:

a <- paste("jul","0","baseline",sep = "_")
    for (d in 1:12){ b <- paste("jul",d,"baseline",sep = "_")
                     a <- paste(a,b, sep=",")
                   }

【问题讨论】:

  • 请发布可重现的示例。
  • 执行此类操作的标准方法是将所有要合并的对象放在一个列表中并使用do.call(merge,your_list)

标签: r string loops


【解决方案1】:

形成整个命令字符串(包括merge),然后对其进行解析和评估:

eval(parse(text = sprintf("merge(%s)", a)))

【讨论】:

    【解决方案2】:

    由于字符串a 中列出的每个jul_i_baseline 都对应一个实际对象,因此您可以这样做:

    temp <- Reduce(function(...) merge(..., all=T), mget(strsplit(a, ",")[[1]]))
    

    strsplit() 函数将a 拆分为一个字符串向量,其中每个元素都是"jul_i_baseline"。它返回一个单元素列表,因此我们可以使用[[1]] 来获取字符串向量。

    mget() 将字符串中的变量列表解释为对象。它返回一个列表,其中每个元素对应于对象。所以每个元素都是实际的 Zoo 对象jul_i_baseline

    Reduce(function(...) merge(..., all=T), &lt;list&gt;) 合并存储在列表每个元素中的对象。假设对象有一个要合并的公共变量,您还可以在merge() 中添加一个 by 变量。


    cmets 中建议的另一种方法是使用do.call(),因为您正在处理 Zoo 对象,所以它会起作用。 (前一种方法也适用于非 Zoo 对象,但它不适用。)命令的结构如下:

    temp <- do.call(merge, mget(strsplit(c, ",")[[1]]))
    

    我们再次使用mget()strsplit() 获取对象。


    @G.Grothendiek 建议使用eval(parse(...)) 在这种情况下也有效。但是,许多 R 用户通常不鼓励使用 eval(parse(...))。见here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多