【问题标题】:how to use for loops to iterate bunch of codes for 15 years?如何使用 for 循环迭代一堆代码 15 年?
【发布时间】:2021-05-11 14:41:33
【问题描述】:

我是 Stack 社区和 R 的新手。我试图在一年的一堆代码之后获得三个特定值,即 2000 年。所以,我得到一行三列。但是,我需要将这些特定值作为输出再持续 14 年,直到 2014 年。我怎样才能以一种不凌乱的方式循环,需要一些建议。我正在尝试以下代码:

CVA <-data.frame()
for(i in 2000:2014) {
  
  
D.2000 <-  filter(Deu.niot.new, ...1==i)
D.dom.2000 <-filter(Deu.2000,...4=="Domestic")

D.imp.2000 <-filter(Deu.2000,...4=="Imports")


D.ndom.2000 <-select(Deu.2000.dom,-(...61:...67))
D.nimp.2000 <-select(Deu.2000.imp,-(...61:...67)) 

等等....(更多代码)

那么,我需要以下一个作为我的最终结果:

CVA [[i,]]<-cbind(cva.agri.2000,cva.manu.2000,cva.ser.2000)

这意味着我需要使用 for 循环再创建 14 行 3 列。使用上面的一堆代码,我刚刚得到了 2000 的值。我需要输出为 data.frame。

任何提示或建议都会有所帮助!

我用 dput 来展示我的数据结构,不过看起来真的很乱:

结构(列表(...1 = c(2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000), ...2 = c("A01", "A02", "A03", "B", "C10-C12", "C13-C15", "C16", "C17", "C18", "C19"), ...3 = c("作物和动物生产、狩猎和相关服务活动", “林业和伐木”,“渔业和水产养殖”,“采矿和采石”, “食品、饮料和烟草制品的制造”, “纺织品、服装和皮革制品的制造”, “木材以及木材和软木制品的制造,家具除外;稻草和编织材料制品的制造”, “纸和纸制品的制造”,“记录媒体的印刷和复制”, "焦炭和精炼石油产品的制造"), ...4 = c("国内", “国内”、“国内”、“国内”、“国内”、“国内”、“国内”、 "国内", "国内", "国内"), ...5 = c(1180.79357309081, 38.9191594938878, 0.0105591974138373, 20.3813413720862, 2717.28244274957, 26.4883571262503, 47.5892951388691, 22.4047547307701, 31.3319695906172, 444.595589525748), ...6 = c(82.985934075375, 417.382557034188, 0, 0.353736300347672, 1.95091900568706, 1.19359373503498, 68.3727666976661, 2.95275151914329, 4.46816919858237, 12.3444402345904), ...7 = c(0.0148890463411341, 0.0168962782166389, 4.49517538484516, 0.030235623520195, 0.378606553315736, 9.08182032551762, 1.07007663240345, 1.26467070570843, 0.905244246509581, 2.4453813655119), ...8 = c(12.4358144539012, 23.2895865413182, 0.0166626654844983、76.2371092458133、21.1129192358641、2.88107063157295、 47.303659680883、68.154120909302、33.2904033042654、56.5944153631193 ), ...9 = c(17952.563202823, 5.2593139999212, 22.4131588651991, 116.814290718508, 14706.3043351145, 63.77989250888, 149.697280644864, 1269.36851882589, 239.087006514138, 345.705681202278), ...10 = c(52.8680776105079, 0.980236672662672、0.00396924705354、18.0442003449513、81.890380752962、 1623.56216722411, 28.8605439638297, 193.373586146434, 206.014971131385, 61.8673029946462)), row.names = c(NA, -10L), class= c("tbl_df", "tbl", "data.frame"))

此处仅显示 10 行,因此仅显示 2000 年的数据。但是数据框包含 15 年(2000 年到 2014 年)。

输出应如下所示: |年 |农业 |马努 |服务| |:---:|:---:|:---:|:--:| |2000|价值|价值|价值|

|2001|价值|价值|价值|

所以,我需要每年存储三个值的输出作为最终输出。所以,15 行,3 列。

【问题讨论】:

  • 您好,如果您提供一个最小的工作示例(stackoverflow.com/help/minimal-reproducible-example)会很有帮助。你的输入数据是什么样的
  • 如今,R 中的 For 循环几乎绝迹。将数据更改为适合矢量化的形式,然后将数据恢复为其原始形式几乎总是更快。编码速度更快,运行速度更快。
  • 非常感谢!试图这样做。
  • 嗨,我已经提供了我的数据结构和预期的输出。如果可能的话,期待进一步的建议。

标签: r dataframe loops for-loop iteration


【解决方案1】:

你有像 ...1, ...2 这样的列名吗?导入数据可能会出现一些问题。

不过,您可以使用拆分-应用-组合方法。

do.call(rbind, lapply(split(Deu.niot.new, Deu.niot.new$`...1`), function(x) {
  #x is the dataframe for each year
  #So this step (D.2000 <-  filter(Deu.niot.new, ...1==i)) is replaced with `x`.
  D.dom.2000 <-filter(Deu.2000,...4=="Domestic")
  D.imp.2000 <-filter(Deu.2000,...4=="Imports")
  #...
  #...
  D.ndom.2000 <-select(Deu.2000.dom,-(...61:...67))
  D.nimp.2000 <-select(Deu.2000.imp,-(...61:...67)) 
  #...
  #...
  cbind(cva.agri.2000,cva.manu.2000,cva.ser.2000)
})) -> CVA

CVA

【讨论】:

  • 谢谢!但是,我尝试了拆分应用组合方法,[ UseMethod("filter") 中的错误:没有适用于“过滤器”的方法应用于类“列表”的对象] 发生此错误。然后,我尝试用其他代码将filter替换为split,再次发现[Error in split.default(Deu.2000, Deu.2000$Domestic) : group length is 0 but data length > 0] 错误,请帮助!跨度>
  • @Archer_Jazz 您提供的信息无法为您提供更多帮助。您应该提供一个小数据示例以及预期输出,以便为您提供帮助。阅读how to give a reproducible example
  • 嗨,我已经在我的问题下方提供了我的数据结构和预期输出。如果可能的话,期待进一步的帮助或建议。
  • 感谢您添加数据,但您还没有告诉您要对其进行哪些处理以获得预期的输出。我没有看到您在共享数据中有任何名为 AgriManuSer 的列或值。你如何在预期的输出中得到它?
  • 非常感谢您的帮助!最后用for循环解决了。
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2010-12-28
  • 2022-12-08
  • 1970-01-01
相关资源
最近更新 更多