从动态变量中选择一列

Don*_*n P -1 variables for-loop r dynamic

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

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

我用这个语法:

sprintf("population.%s", country)[, 2]
Run Code Online (Sandbox Code Playgroud)

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

jor*_*ran 11

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

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

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

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

population <- vector("list",3)
names(population) <- c('USA','Mexico','Russia')
Run Code Online (Sandbox Code Playgroud)

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

population[['USA']] <- 10000
Run Code Online (Sandbox Code Playgroud)

要么,

region <- 'USA'
population[[region]]
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我为列表元素分配了一个值,列表将保存任何其他数据类型,包括矩阵或数据帧.这将是一个很大的打字小于使用sprintfassign,和很多更安全,更高效的为好.


Rei*_*son 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
Run Code Online (Sandbox Code Playgroud)

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

> sprintf("population.%s", country)
[1] "population.FOO"
Run Code Online (Sandbox Code Playgroud)

此时,如果您还没有知道或者想过要读取的话?sprintf,将立即清楚地sprintf()返回一个不是该名称对象的字符串.有了这些知识,您可以将问题缩小到如何从计算名称中调用对象?