【问题标题】:Data Frame that keeps track of particular events in R跟踪 R 中特定事件的数据框
【发布时间】:2018-03-03 15:45:40
【问题描述】:

我有下表:

Name        Date       Score
John      11-01-02      40
John      11-01-03      47
John      11-01-04      41
John      11-01-05      35
John      11-01-06      52
John      11-01-07      47
John      11-01-08      45
John      11-01-09      43
John      11-01-10      40
Adam      11-01-02      41
Adam      11-01-03      41
Adam      11-01-04      49
Adam      11-01-05      40
Adam      11-01-06      40

我只想跟踪以下事件:对于每个学生,跟踪学生何时以及多少次 1) 分数增加 5 或更多,然后分数减少 5 或更多或 2 ) 分数降低 5 或更多,然后分数增加 5 或更多。

我制作了下表来帮助完成上述任务:每个学生的分数差异表。

Name        Date      Difference
John      11-01-03       7
John      11-01-04      -6
John      11-01-05      -6
John      11-01-06      17
John      11-01-07      -5
John      11-01-08      -2
John      11-01-09      -2
John      11-01-10      -3
Adam      11-01-04       8
Adam      11-01-05      -9
Adam      11-01-06       0

例如,2003 年 1 月 11 日,约翰的得分从 02 年 1 月 1 日的 40 上升到 47,因此 47-40=7 的差异。

我想要下表作为输出:

一个记录事件名称、日期的工具

Name        Dates for Events
John            11-01-03      
John            11-01-05
John            11-01-06
Adam            11-01-04

2003 年 1 月 11 日,John 经历了 7 分的变化,随后是 -6,因此 John 经历了我所描述的事件。出于同样的原因,也包括了其他日期。

在 R 中有一种简单的方法吗?任何帮助将不胜感激。

【问题讨论】:

  • John 11-01-05 应该在,John 11-01-07 不应该(两个连续减少)
  • @denis 是的。我编辑了。谢谢
  • John 11-01-03 应该在

标签: r dataframe datatable


【解决方案1】:

使用dplyr 的一个选项可以是:

data %>% group_by(Name) %>%
  mutate(diff = lead(Score) - Score,
         score_increase_5 = ifelse(diff >= 5, TRUE, FALSE),
         score_decrease_5 = ifelse(diff <= -5, TRUE, FALSE)) %>%
  filter(!is.na(diff)) %>%
  mutate(event = ((score_decrease_5 & lag(score_increase_5)) |
  (score_increase_5 & lag(score_decrease_5)))) %>%
  filter(event) %>%
  select(Name, Date)

【讨论】:

    【解决方案2】:

    这个想法是创建两列与上一行的差异,以及与下一行的差异。然后,您可以选择带有条件的 sub-data.frame。

    这是 data.table 的解决方案

    library(data.table)
    plouf <- read.table(text = "
    Name        Date       Score
    John      11-01-02      40
    John      11-01-03      47
    John      11-01-04      41
    John      11-01-05      35
    John      11-01-06      52
    John      11-01-07      47
    John      11-01-08      45
    John      11-01-09      43
    John      11-01-10      40
    Adam      11-01-02      41
    Adam      11-01-03      41
    Adam      11-01-04      49
    Adam      11-01-05      40
    Adam      11-01-06      40",header = T)
    plouf <- setDT(plouf)
    plouf[,Score:= as.numeric(Score)]
    plouf[,diffprev := c(NA,diff(Score)), by = Name]
    plouf[,difffol :=c(Score[2:.N]-Score[1:(.N-1)],NA),by = Name]
    

    然后你做选择

    plouf[(diffprev >= 5 & difffol <= -5) |(diffprev <= -5 & difffol >= 5),.(Name,Date)]
    

    给了

    > plouf[(diffprev >= 5 & difffol <= -5) |(diffprev <= -5 & difffol >= 5)]
       Name     Date Score diffprev difffol
    1: John 11-01-03    47        7      -6
    2: John 11-01-05    35       -6      17
    3: John 11-01-06    52       17      -5
    4: Adam 11-01-04    49        8      -9
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多