【问题标题】:How can we store these dates into another dataframe as we loop through?我们如何在循环时将这些日期存储到另一个数据框中?
【发布时间】:2021-09-15 18:06:13
【问题描述】:

在 R (studio) 中,我尝试了很多次迭代,只将日期存储到 turning_point_dates 数据框中,但我只能让它存储循环数。我可以打印找到的每个日期,但还不能存储它们。

dates = data.frame(Date = seq(from = as.Date("2002-06-01"), to = as.Date("2011-09-30"), by = 'day'))
   
nums = c(98,99,100,101,102,103,104,105,106,107)
dataframe_of_numbers = data.frame(nums)    

mat = matrix(ncol=0, nrow=0)
turning_point_dates = data.frame(mat)

for (i in 1:nrow(dataframe_of_numbers)){
   print(dates$Date[dataframe_of_numbers[i,]])
   turning_point_dates[i,] = dates$Date[dataframe_of_numbers[i,]]
}

turning_point_dates

我怎样才能将循环的实际日期存储到 turning_point_dates 数据框中?

turning_point_dates 输出如下所示的数据框: 说明:df [10 x 0]

1               
2               
3               
4               
5               
6               
7               
8               
9               
10              
1-10 of 10 rows

当我想要这样的数据框时:

"2002-09-06"
"2002-09-07"
"2002-09-08"
"2002-09-09"
"2002-09-10"
"2002-09-11"
"2002-09-12"
"2002-09-13"
"2002-09-14"
"2002-09-15"

【问题讨论】:

  • 您能更清楚地了解您要做什么吗?此外,由于as.Date("20011-09-31") 引发错误,该代码不会按原样运行。
  • 我进行了一些编辑以使其更加清晰,并修复了错误,以便它现在可以运行。谢谢。

标签: r dataframe loops


【解决方案1】:

有点不清楚,但是如果您想最终得到一个较小的数据框,该数据框仅具有与nums 中的行号对应的日期,则不需要使用循环。您可以使用num 对数据框进行子集化,如下所示。

我还建议使用tibble 而不是基本的data.frame,因为子集tibble 会返回一个小标题,而子集data.frame 会返回一个向量。

library(tibble)

dates <- tibble::tibble(Date = seq(from = as.Date("2002-06-01"), 
                                   to = as.Date("2011-09-30"), 
                                   by = 'day'))

nums <- c(98,99,100,101,102,103,104,105,106,107)

dates_subsetted <- dates[nums,]

它也可以通过循环来完成,但在我看来它更笨重。如果您有大量数据,它几乎肯定会慢得多。

但是既然被问到了:

library(dplyr)
# set up another tibble for the values we'll extract
dates_looped <- tibble::tibble()

# loop through each row of the input, add that row if 
for (i in 1:nrow(dates)){
  if (i %in% nums) {
    dates_looped <- dplyr::bind_rows(dates_looped, dates[i,])
  }  
}

dates_loopeddates_subsetted 是相同的,但制作 dates_subsetted 只需要一行代码,运行速度会快很多倍。

【讨论】:

  • 哦,很好,谢谢。这很好用:) 它甚至可以在一个循环中完成吗?我还是想知道怎么做。谢谢。
  • 可以,但是在R中使用向量子集更快更容易。我已经更新了答案给你一个想法。
  • 谢谢。我肯定会更快地看到重点。无论哪种方式,我都很欣赏这种洞察力。谢谢!
  • 如果答案对你有用,别忘了把它标记为正确:)
  • 好的,谢谢提醒,还在学习这个论坛。
【解决方案2】:

我认为您不需要循环来执行此操作。这是我所做的:

dates <- data.frame(Date = seq(from = as.Date("2002-06-01"), to = as.Date("2011-09-30"), by = 'day'))

nums = c(98,99,100,101,102,103,104,105,106,107)

turning_point_dates <- data.frame(nums, dates = dates$Date[nums])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多