【问题标题】:Delete next row after every count/list of day; in R在每天的每个计数/列表之后删除下一行;在 R 中
【发布时间】:2017-04-14 02:16:26
【问题描述】:

我发现很难理解这一点: 在下面的数据框中,我想在每个计数/列表之后删除下一行,例如星期四,星期五相同,依此类推。我宁愿不使用循环,因为数据很大。

mydata<- read.table(header=TRUE, text=" 

    Date     AAPL.ret  Weekday Thursday

1 2001-01-04 0.000000000 星期四 1 2 2001-01-04 0.000000000 星期四 1 3 2001-01-04 -0.025317808 星期四 1 4 2001-01-04 0.014545711 星期四 1 5 2001-01-04 0.007194276 星期四 1 6 2001-01-04 -0.007194276 星期四 1 7 2001-01-05 -0.0278569545 星期五 0 8 2001-01-05 0.0056338177 星期五 0 9 2001-01-05 0.0037383221 星期五 0 10 2001-01-05 0.0000000000 星期五 0 11 2002-02-25 3.511856e-03 星期一 0 12 2002-02-25 -3.511856e-03 星期一 0 13 2002-02-25 -4.398505e-04 星期一 0 14 2002-02-25 -2.643173e-03 星期一 0 15 2002-02-25 4.401416e-03 星期一 0 16 2002-02-26 9.189066e-03 星期二 0 17 2002-02-26 -8.243166e-04 星期二 0 18 2002-02-26 9.533751e-03 星期二 0 19 2002-02-26 4.527688e-03 星期二 0 20 2002-02-26 4.105933e-04 星期二 0 ...... 100 2002-03-01 8.717651e-03 星期五 0 101 2002-03-01 1.990115e-02 星期五 0 102 2002-03-01 -1.344387e-03 星期五 0 103 2002-03-01 -1.445373e-02 星期五 0 ") 我需要的输出应该是这样的:

    Date     AAPL.ret  Weekday Thursday

1 2001-01-04 0.000000000 星期四 1 2 2001-01-04 0.000000000 星期四 1 3 2001-01-04 -0.025317808 星期四 1 4 2001-01-04 0.014545711 星期四 1 5 2001-01-04 0.007194276 星期四 1 6 2001-01-04 -0.007194276 星期四 1 7 2001-01-05 0.0056338177 星期五 0 8 2001-01-05 0.0037383221 星期五 0 9 2001-01-05 0.0000000000 星期五 0 11 2002-02-25 -3.511856e-03 星期一 0 12 2002-02-25 -4.398505e-04 星期一 0 13 2002-02-25 -2.643173e-03 星期一 0 14 2002-02-25 4.401416e-03 星期一 0 15 2002-02-26 -8.243166e-04 星期二 0 16 2002-02-26 9.533751e-03 星期二 0 17 2002-02-26 4.527688e-03 星期二 0 18 2002-02-26 4.105933e-04 星期二 0 ...... 100 2002-03-01 1.990115e-02 星期五 0 101 2002-03-01 -1.344387e-03 星期五 0 102 2002-03-01 -1.445373e-02 星期五 0

提前谢谢你。对不起,如果我错误地问了这个问题。这是我第一次在这里提问;我尽量遵守规则;尤其是表格的显示方式。

我相信,我尝试过的代码与我想要的答案相去甚远。只是计数和子集;以下。 表(ret.df$Weekday=="Thursday") r1

我希望我的问题现在不那么含糊了。

上一个答案的后续:

根据 ret_1ON 中的条件删除行

ret_1ON<- ret.df[duplicated(ret.df$Date)|1:nrow(ret.df)==1,]

暗淡(ret_1ON)

[1] 98734 4

head(ret_1ON)

    Date     AAPL.ret  Weekday Thursday

1 2001-01-04 0.000000000 星期四 1 2 2001-01-04 0.000000000 星期四 1 3 2001-01-04 -0.025317808 星期四 1 4 2001-01-04 0.014545711 星期四 1 5 2001-01-04 0.007194276 星期四 1 6 2001-01-04 -0.007194276 星期四 1

tail(ret_1ON)
        Date      AAPL.ret  Weekday Thursday

99994 2006-01-19 0.0013771520 星期四 1 99995 2006-01-19 -0.0007321584 星期四 1 99996 2006-01-19 -0.0029026141 星期四 1 99997 2006-01-19 -0.0002511616 星期四 1 99998 2006-01-19 0.0011297309 星期四 1 99999 2006-01-19 -0.0002509410 星期四 1

我在徘徊为什么尾部的最后一项不是 98734 而是 99999?

dim(ret.df)

[1] 99999 4 这意味着条件已经生效。

【问题讨论】:

  • 您希望从这些数据中得到什么输出?只是“删除第 79 行”吗?
  • @r2evans 删除第 79 行只是我需要的第一件事,然后在数据中的所有日子重复相同的过程。我只展示了一部分数据。
  • 是的,所以在 this 数据中,唯一的区别是第 79 行,对吗? (顺便说一句,您不必显示这么多数据来完成问题。您可能会每天抓取 5-8 行,显示多天,以便您收到的答案可能更灵活/正确。)
  • 您是否打算删除每天的第一行?你的描述有点模糊。您能否修改您的数据,使 95% 的数据不是同一天?另外,请指明您想要的输出和/或您认为应该删除哪些行(数字)。最后,到目前为止,您尝试了哪些代码?
  • @r2evans 谢谢。是的,你是对的。

标签: r date count delete-row


【解决方案1】:

我们可以通过data.table 做到这一点

library(data.table)
setDT(mydata)[, .SD[(seq_len(.N) != 1)], Date]

如果我们想保留数据集的第一行

setDT(mydata)[, .SD[(seq_len(.N) != 1)|seq_len(.N)==.I[1]], Date]

dplyr

library(dplyr)
mydata %>%
      group_by(Date) %>%
      filter(row_number() != 1)

或者使用base R,如果“日期”列是ordered

mydata[duplicated(mydata$Date),]

或包含第一行

mydata[duplicated(mydata$Date)|1:nrow(mydata)==1,]

【讨论】:

  • 谢谢。您的代码完美地满足了我的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 2020-06-05
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多