-1

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

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

我使用这种语法:

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

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

4

2 回答 2

11

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

  1. 不要使用sprintf.
  2. 不要使用assign.

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

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

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

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

population[['USA']] <- 10000

或者,

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

在此示例中,我为列表元素分配了一个值,列表将保存任何其他数据类型,包括矩阵或数据框。与使用and相比,打字会少很多,而且更安全、更高效。sprintfassign

于 2012-08-04T21:46:50.860 回答
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()将返回一个字符串,而不是该名称的对象。有了这些知识,您就会将问题缩小到如何从计算的名称中调用对象?

于 2012-08-04T21:36:48.713 回答