首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R "for循环“和/或应用于动态转换多个变量。

R "for循环“和/或应用于动态转换多个变量。
EN

Stack Overflow用户
提问于 2018-09-27 12:11:19
回答 2查看 692关注 0票数 3

我正在尝试将我将在EViews中使用的"for循环“技术转换/复制到R中。我试图复制一个"for循环“,在这个循环中,我将一个时间序列变量除以另一个时间序列变量(向量),并将其保存为一个新序列。

由于我使用一个常见的命名约定(例如GDP (real)、GDPn (名义)和GDP_P (价格),请参阅下面的EViews示例),我可以一次声明变量列表,并使用后缀("n“或"_P")中的更改来创建动态的系列名称,并在所需的计算中循环。我的输入数据是国民账户支出系列。

代码语言:javascript
复制
'EViews shorthand "for next" loop:

%CATS = "GDP CONS INV GOV EX IM"
 for %CATS {%cats}
   series {%cats}_P= {%cats}n / {%cats}
 next

'Which is shorthand replication of below ("series" declares a series of the subsequent name):

series GDP_P    = GDPn / GDP
series CONS_P   = CONSn / CONS
series INV_P    = INVn /  INV
series GOV_P    = GOVn / GOV
series EX_P     = EXn / EX
series IM_P     = IMn / IM

到目前为止,我已经尝试使用一个loop循环(我在R中不是首选的方法),方法是创建一个系列名称的向量,并使用“Assition(粘贴”)来进行计算。下面是一个例子,但它不起作用。根据我所读到的关于" for“命令的内容,"i”声明的系列只能是值的向量或名称的向量,没有进一步的上下文:

代码语言:javascript
复制
cats<-c("GDP","CONS","GOV","INV","EX","IM")
for (i in cats){
  assign(paste(i, "_P",sep=""), paste(i, "n",sep="")/i)
}

我还对“应用”函数和衍生工具进行了大量阅读,但我看不出上面的场景是如何工作的。任何关于如何在R中这样做的建议都是有帮助的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-27 12:53:31

您的功能应该像这样工作:

代码语言:javascript
复制
cats<-c("GDP","CONS","GOV","INV","EX","IM")
for (i in cats){
  assign(paste(i, "_P",sep=""), get(paste(i, "n",sep=""))/get(i))
}

get将使用您提供的字符串,并找到该名称的向量。

还有一种非循环的方法,使用答案之一here的想法。

代码语言:javascript
复制
txt<-paste0(cats, "_P <- ", cats, "n/", cats)
eval(parse(text=txt))

txt将包含一个列表,列出手动创建所有向量所需输入的所有行,然后eval(parse(text=txt))接受每个命令并逐一执行它们。

当然,您可以跳过将文本分配给txt --我只是想让它更清楚地了解这里发生的事情:

代码语言:javascript
复制
eval(parse(text=paste0(cats, "_P <- ", cats, "n/", cats)))
票数 1
EN

Stack Overflow用户

发布于 2018-09-27 14:55:54

考虑使用列表,特别是对于许多类似的元素。这样做,您就可以更好地管理您的全局环境,并更加简洁有效地处理数据。对你来说,这意味着保持3个向量列表,而不是18个单独的命名向量(2个原始集合和新的第3组)。动态使用assign动态创建变量通常表示有机会使用命名列表。

具体来说,在GDPn_list和GDP_list中收集项,然后使用Map (mapply的非简化包装器)在调用除法函数/的两个等长列表之间按元素迭代。然后用setNames()命名列表。下面演示的是随机数据,但对于您来说,OP可以使用注释行来构建列表。

原始数据

代码语言:javascript
复制
cats <- c("GDP","CONS","GOV","INV","EX","IM")

set.seed(9272018)
GDPn_list <- setNames(replicate(6, runif(50)*120, simplify=FALSE), paste0(cats, "n"))
# GDPn_list <- list(GDPn, CONSn, GOVn, INVn, EXn, IMn)

str(GDPn_list)
# List of 6
#  $ GDPn : num [1:50] 52.4 31.9 10.6 118.4 66 ...
#  $ CONSn: num [1:50] 18.27 22.3 95.13 87.44 9.79 ...
#  $ GOVn : num [1:50] 48.83 69.73 113.61 35.53 1.21 ...
#  $ INVn : num [1:50] 51.9 96.9 28.2 67.2 19 ...
#  $ EXn  : num [1:50] 28.3 94.3 42.3 65.5 83.6 ...
#  $ IMn  : num [1:50] 109.3 26.6 60.2 78.2 55.5 ...

GDP_list <- setNames(replicate(6, runif(50)*100, simplify=FALSE), cats)
# GDPn_list <- list(GDP, CONS, GOV, INV, EX, IM)

str(GDP_list)    
# List of 6
#  $ GDP : num [1:50] 51.1 65.9 41.5 24.5 87.3 ...
#  $ CONS: num [1:50] 47.66 77.32 46.97 48.61 2.98 ...
#  $ GOV : num [1:50] 32.6 70.3 21.5 73.4 97.8 ...
#  $ INV : num [1:50] 80.7 16.8 57.4 80.7 12.1 ...
#  $ EX  : num [1:50] 38.1 78.1 40.6 62.8 61.9 ...
#  $ IM  : num [1:50] 39.8 84.8 11.4 39.7 14.7 ...

新数据

代码语言:javascript
复制
GDPp_list <- setNames(Map(`/`, GDPn_list, GDP_list), paste0(cats, "p"))

str(GDPp_list)    
# List of 6
#  $ GDPp : num [1:50] 1.025 0.484 0.256 4.835 0.756 ...
#  $ CONSp: num [1:50] 0.383 0.288 2.025 1.799 3.286 ...
#  $ GOVp : num [1:50] 1.4969 0.9921 5.2891 0.4844 0.0124 ...
#  $ INVp : num [1:50] 0.644 5.775 0.491 0.832 1.578 ...
#  $ EXp  : num [1:50] 0.744 1.207 1.043 1.043 1.352 ...
#  $ IMp  : num [1:50] 2.747 0.314 5.293 1.971 3.783 ...

您仍然可以通过名称或索引号引用基本的数字向量,而不会丢失任何功能或数据:

代码语言:javascript
复制
GDPp_list$GDPp
GDPp_list$CONSp
GDPp_list$GOVp
...

GDPp_list[[1]]
GDPp_list[[2]]
GDPp_list[[3]]
...

如果向量长度相等,从你的列表中构建一个矩阵!这一次使用mapply

代码语言:javascript
复制
GDPp_matrix <- mapply(`/`, GDPn_list, GDP_list)
colnames(GDPp_matrix) <- paste0(cats, "p")

head(GDPp_matrix)

#           GDPp      CONSp       GOVp       INVp       EXp      IMp
# [1,] 1.0252871  0.3832836 1.49687150  0.6436575 0.7441159 2.746551
# [2,] 0.4835700  0.2884577 0.99208666  5.7753575 1.2067694 0.314102
# [3,] 0.2562130  2.0251752 5.28913247  0.4910816 1.0429316 5.292843
# [4,] 4.8345697  1.7987625 0.48436284  0.8322211 1.0431301 1.970523
# [5,] 0.7563794  3.2859395 0.01236608  1.5781949 1.3518592 3.783420
# [6,] 0.1515318 10.9332338 1.10608066 13.7953500 0.7211371 1.918249
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52536735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档