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时,我会为您提供两条一般性建议:
sprintf
.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)
在这个例子中,我为列表元素分配了一个值,列表将保存任何其他数据类型,包括矩阵或数据帧.这将是一个很大的打字小于使用sprintf
和assign
,和很多更安全,更高效的为好.
见?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()
返回一个不是该名称对象的字符串.有了这些知识,您可以将问题缩小到如何从计算名称中调用对象?