【问题标题】:R: how to add rows in dataframe by manipulating a datetime columnR:如何通过操作日期时间列在数据框中添加行
【发布时间】:2021-09-30 16:45:06
【问题描述】:

我有一个看起来像这样的参考股票代码表

我想调查每个“演出日期”前后的价格变化。

例如,我想为一个现有行添加 2 个新行,显示日期为 -1 和 + 1 天,基本上使表格膨胀 3 次。将所有其他列留空,除非确保正确添加了符号。

That is: 
for first row             ZTS 2017-01-09 Buy 
I want to add 2 more rows ZTS 2017-01-08
                          ZTS 2017-01-10

For the next row          ZTS 2016-11-02 Buy 
add 2 more rows           ZTS 2016-11-01 
                          ZTS 2016-11-03 
etc...

我阅读了有关 add_rows() 的信息,但该函数不允许我这样做。这篇文章也没有解决它 Add rows to a data-frame based on values in one of the columns

有人可以这样做吗?通常我只处理列.....

>dput(head(sanitised))
structure(list(Company = c("Agilent Technologies ", "Agilent 
Technologies ", 
"Agilent Technologies ", "Agilent Technologies ", "Agilent 
Technologies ", 
"Alcoa "), symbol = c("A", "A", "A", "A", "A", "AA"), showdate = 
c("2021-08-18", 
"2020-04-16", "2017-11-17", "2017-03-23", "2016-05-13", "2016-10- 
07"
), call = c("Buy", "Buy", "Buy", "Buy", "Buy", "Buy"), 
show_segment = c("Guest Interview", 
"Guest Interview", "Discussed Stock", "Featured Stock", 
"Discussed Stock", 
"Discussed Stock"), call_price = c("$163.02", "$78.75", "$68.79", 
"$53.18", "$42.49", "$31.37"), current_returns = c("+0.0%", 
"+0.0%", 
"+0.0%", "+0.0%", "+0.0%", "+0.0%"), day_7_returns = c("", "", 
"", "+0.3%", "+5.7%", "-15.7%"), day_14_returns = c("", "", "", 
"-0.1%", "", ""), day_30_returns = c("", "", "", "", "+6.8%", 
"-19.7%")), row.names = c(NA, 6L), class = "data.frame")

【问题讨论】:

  • 使用dput() 提供可重现的数据。图片遗漏了重要信息,例如您拥有什么样的日期对象。
  • @dcarlson 对此感到抱歉。就是这样,我在桌子上做了一个很大的装饰来展示头部

标签: r dataframe datetime data-wrangling


【解决方案1】:

这是使用split 和map_dfr 的一种方法。我假设对于添加的行,大多数列中的值将是 NA。您当然可以在 add_row 中添加其他值。

library(tidyverse)

sanitised %>%
  mutate(showdate = as.Date(showdate, format = '%Y-%m-%d')) %>%
  split(list(sanitised$symbol, sanitised$showdate)) %>%
  map_dfr(function(x) {
    x %>%
      # any other columns you want to keep could go in here as well
      add_row(symbol = x$symbol, showdate = x$showdate - 1) %>%
      add_row(symbol = x$symbol, showdate = x$showdate + 1)
  })

【讨论】:

  • Ho @Harrison Jones,感谢您的帮助,它正在我的笔记本电脑上运行(抱歉,实际表格有 9000 行,但看起来它正在工作)。请问您能否解释一下 split 和 map_dtr 位?我还是这个级别的新手。喜欢他们在做什么?
  • 另外,我可以贪心请你看看我的其他问题吗?stackoverflow.com/questions/69396350/…
  • split 获取数据框并将其转换为列表。为了回答您的问题,这只是组织数据的一种方式。 map_dfr 将在每个列表元素上运行一个函数,在本例中是 symbol 和 showdate 列的每个组合。我正在考虑的一种替代方法是使用group_modify。有人可能会使用这种方法提供不同的答案。
【解决方案2】:

这是一个带有循环的基本 R 方法,假设“符号”是唯一复制的列:

x$showdate <- as.Date(x$showdate)
for(i in rownames(x)){
    x[paste0(i, ".", 1), "showdate"] <- x[i, "showdate"] - 1
    x[paste0(i, ".", 2), "showdate"] <- x[i, "showdate"] + 1
    x[paste0(i, ".", 1), "symbol"] <- x[i, "symbol"]
    x[paste0(i, ".", 2), "symbol"] <- x[i, "symbol"]
}
x <- x[order(rownames(x)), ]

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2018-08-12
    相关资源
    最近更新 更多