从动态变量中选择一列

时间:2012-08-04 21:30:22

标签: r variables dynamic for-loop

如何选择动态命名变量的第二列?

我创建了“population.USA”,“population.Mexico”,“population.Canada”形式的变量。每个变量都有一年的列,另一列的人口值。我想在循环期间从每个变量中选择第二列。

我使用这种语法:

sprintf("population.%s", country)[, 2]

R返回错误:Error in sprintf("population.%s", country)[, 2] : incorrect number of dimensions

2 个答案:

答案 0 :(得分:11)

根据您在过去几分钟内的一系列问题,在您熟悉R时,我会为您提供两条一般性建议:

  1. 请勿使用sprintf
  2. 请勿使用assign
  3. 现在,显然,这些功能有时都很有用。但是在你掌握了一些关于R数据结构的基本知识之前,你已经太早了解了它们。尝试编写没有这些拐杖的代码(暂时!),因为它们只会给你带来问题。

    不是为每个国家的人口创建单独的个体变量,而是将它们放在一个列表中。

    population <- vector("list",3)
    names(population) <- c('USA','Mexico','Russia')
    

    然后,您可以使用每个国家/地区名称的字符串表示访问每个国家/地区:

    population[['USA']] <- 10000
    

    或者,

    region <- 'USA'
    population[[region]]
    

    在这个例子中,我为列表元素分配了一个值,列表将包含任何其他数据类型,包括矩阵或数据帧。与使用sprintfassign相比,输入很少,并且更安全,更高效。

答案 1 :(得分:6)

请参阅?get。这是一个例子:

> country <- "FOO"
> assign(sprintf("population.%s", country), data.frame(runif(5), runif(5)))
> 
> get(sprintf("population.%s", country))[,2]
[1] 0.2241105 0.5640709 0.5945869 0.1830719 0.1895938

如果出现错误,查看函数返回的对象至关重要。如果您只看一下它返回的内容,很明显为什么您的示例会失败:

> sprintf("population.%s", country)
[1] "population.FOO"

此时,如果您还不知道或曾想过阅读?sprintf,那么sprintf()将返回不是该名称对象的字符串。有了这些知识,您可以将问题缩小到如何从计算名称中调用对象?