【问题标题】:Using vectors as inputs in new variables使用向量作为新变量的输入
【发布时间】:2015-07-02 02:00:51
【问题描述】:

我的数据框是 SPData,其中包括 S&P500 过去 25 年(每年约 250 天)的日期、开盘价、收盘价和交易量。 此外,我还有SPData$Year,它只是一个向量,其中日期列中的年份以数字形式存储,从 1990 年到 2015 年。

library(dplyr)
SPData1990 <- filter(SPData, Year == 1990)

产生一个包含约 250 个观察值的数据框,1990 年每个交易日一个。我已经这样做了 25 年。

有没有办法创建一个公式,将每年对应的所有其他数据保存为新数据框(SPData1991、SPData 1992、SPData1993 等)?我试图通过与公式 years &lt;- unique(SPData$Year, FALSE) 对应的 for(i in years) 循环进行思考,但我对一般编程不够熟悉,无法弄清楚这一点。

谢谢

【问题讨论】:

  • 发布dput(head(SPData, 10)) 的输出以获得更好的帮助
  • 如果你使用split(SPData, SPData$Year),它们可以保存为列表元素,这可能会让你的工作空间更干净。

标签: r loops


【解决方案1】:

感谢@user20650...

# reproducible example!
set.seed(123)
year_range = 1990:2014
SPData <- data.frame(Year=sample(year_range,1000,replace=TRUE),
                     Sales=runif(1000,min=100,max=200) )

# split the list into data frames on "SPDataYYYY" and store in global environment
list2env(split(SPData, paste0("SPData",SPData$Year)),
         envir = .GlobalEnv)
ls()
# [1] "SPData"     "SPData1990" "SPData1991" "SPData1992" "SPData1993" "SPData1994"
# [7] "SPData1995" "SPData1996" "SPData1997" "SPData1998" "SPData1999" "SPData2000"
# [13] "SPData2001" "SPData2002" "SPData2003" "SPData2004" "SPData2005" "SPData2006"
# [19] "SPData2007" "SPData2008" "SPData2009" "SPData2010" "SPData2011" "SPData2012"
# [25] "SPData2013" "SPData2014" "year_range"

【讨论】:

  • 为我辩护,在我点击帖子后,SO 向我扔了一个加载速度极慢的验证码...
  • 我没有投反对票。但是,建议使用 assign 在 r:twitter.com/hadleywickham/status/535931179556691968 中是一种不好的做法。 SO上有很多答案,一再警告不要使用assign
  • 我同意这种观点,而且创建多个 data.frame 对象可能不是一个好主意,但是:这就是发帖人所要求的。要完成所要求的操作,assign 正是我们所需要的。
  • OP 需要 25 个不同的数据帧。我认为哈德利的观点不是“assign 总是一个不好的做法”,而是“有比 25 个不同的数据帧更好的数据结构”,这可能是真的
  • 感谢您的回答,非常有帮助。为什么拥有这么多数据框是不好的做法?
【解决方案2】:

您可以通过使用split 来执行此操作,然后根据拆分因子的级别进行分配。下面我用mtcars 进行说明,但您可以在第一行(myDf)中替换您的数据集,在第二行(splitVar)中替换您的年份变量。

myDf <- mtcars
splitVar <- factor(myDf$gear)
levelsVar <- levels(splitVar)
splitDataFrame <- split(myDf, splitVar)
for (i in 1:length(levelsVar)) {
    assign(paste0("newDataFrameGear", levelsVar[i]), data.frame(splitDataFrame[i]))
}
ls(pattern = "^newData")
## [1] "newDataFrameGear3" "newDataFrameGear4" "newDataFrameGear5"

【讨论】:

  • 为什么不赞成投票......可能不是最佳实践(无论是什么),但如所述回答问题
  • @KenBenoit - 我认为有人对自己得意忘形。问题不是问一个理想的过程,但不需要把它拿出来回答!
  • 很奇怪。在其他新闻中,@user20650 我有兴趣了解如何使用list2env 在全球环境中存储。我看了看,但它只返回&lt;environment: 0x00000000199b4610&gt;
  • @user20650 整洁——如果你不介意,我会用这个来更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2019-08-26
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
相关资源
最近更新 更多