如何选择动态命名变量的第二列?
我创建了“population.USA”,“population.Mexico”,“population.Canada”形式的变量。每个变量都有一年的列,另一列的人口值。我想在循环期间从每个变量中选择第二列。
我使用这种语法:
sprintf("population.%s", country)[, 2]
R返回错误:Error in sprintf("population.%s", country)[, 2] : incorrect number of dimensions
答案 0 :(得分:11)
根据您在过去几分钟内的一系列问题,在您熟悉R时,我会为您提供两条一般性建议:
sprintf
。assign
。现在,显然,这些功能有时都很有用。但是在你掌握了一些关于R数据结构的基本知识之前,你已经太早了解了它们。尝试编写没有这些拐杖的代码(暂时!),因为它们只会给你带来问题。
不是为每个国家的人口创建单独的个体变量,而是将它们放在一个列表中。
population <- vector("list",3)
names(population) <- c('USA','Mexico','Russia')
然后,您可以使用每个国家/地区名称的字符串表示访问每个国家/地区:
population[['USA']] <- 10000
或者,
region <- 'USA'
population[[region]]
在这个例子中,我为列表元素分配了一个值,列表将包含任何其他数据类型,包括矩阵或数据帧。与使用sprintf
和assign
相比,输入很少,并且更安全,更高效。
答案 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()
将返回不是该名称对象的字符串。有了这些知识,您可以将问题缩小到如何从计算名称中调用对象?