将当前的过去值与R中的当前值进行比较,同时丢失数据

时间:2016-09-20 00:58:58

标签: r

我正在使用Rstudio(版本.99.903),有一台PC(Windows 8)。我有一个对我来说真的很难的问题。以下是数据的样子:

     Number     Trial       ID  Open date   Enrollment
     420        NCT00091442 9   1/28/2005   0.2
     1476       NCT00301457 26  2/22/2008   1
     10559      NCT01307397 34  7/28/2011   0.6
     6794       NCT00948675 53  5/12/2010   0
     6451       NCT00917384 53  8/17/2010   0.3
     8754       NCT01168973 53  1/19/2011   0.2
     8578       NCT01140347 53  12/30/2011  2.4
     11655      NCT01358877 53  4/2/2012    0.3
     428        NCT00091442 55  9/7/2005    0.1
     112        NCT00065325 62  10/15/2003  0.2
     477        NCT00091442 62  11/11/2005  0.1
     16277      NCT01843374 62  12/16/2013  0.2
     17386      NCT01905657 62  1/8/2014    0.6
     411        NCT00091442 66  1/12/2005   0

我需要做的是将ID中每个日期的注册与之前的日期进行比较。如果之前的ID中没有日期,则不应进行比较。例如,对于ID 26,将没有比较。同样,对于ID 53,没有比较2010年5月12日,但我想比较2010年8月17日至2010年5月12日,然后是2011年1月19日至2010年8月17日(但也没到2010年5月12日)。理想情况下,输出是一个点图,它绘制电流值与先前值的关系(先前将在y轴上,当前在x轴上)。最后,我需要生成一个列,该列从前一个...

中减去当前值

有> 20,000个数据点。我试图写一个脚本来回顾之前的事情,但我还没有能够控制身份证。另外,我想如果我回顾一年,两年,五年等等,它不会有太大的不同......?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

至于数据流程,我认为您想要的是在两个日期之间获得差异。您可以通过几种方式实现这一目标。在这里,我选择在data.table包中使用shift()。您可以在函数和句柄减法中指定type = "lag"。您可以通过指定by = ID为每个ID执行此操作。我无法想象你脑海里有什么样的情节。如果您能澄清您在问题中的含义,我很乐意为您提供支持。

library(tidyverse)
library(data.table)

setDT(mydf)[, Opendate := as.IDate(Opendate, format = "%m/%d/%Y")][,
    out := as.numeric(Opendate - shift(Opendate, type = "lag")), by = ID][,
    out := coalesce(out, 0)]


#    Number       Trial ID   Opendate Enrollment  out
# 1:    420 NCT00091442  9 2005-01-28        0.2    0
# 2:   1476 NCT00301457 26 2008-02-22        1.0    0
# 3:  10559 NCT01307397 34 2011-07-28        0.6    0
# 4:   6794 NCT00948675 53 2010-05-12        0.0    0
# 5:   6451 NCT00917384 53 2010-08-17        0.3   97
# 6:   8754 NCT01168973 53 2011-01-19        0.2  155
# 7:   8578 NCT01140347 53 2011-12-30        2.4  345
# 8:  11655 NCT01358877 53 2012-04-02        0.3   94
# 9:    428 NCT00091442 55 2005-09-07        0.1    0
#10:    112 NCT00065325 62 2003-10-15        0.2    0
#11:    477 NCT00091442 62 2005-11-11        0.1  758
#12:  16277 NCT01843374 62 2013-12-16        0.2 2957
#13:  17386 NCT01905657 62 2014-01-08        0.6   23
#14:    411 NCT00091442 66 2005-01-12        0.0    0

DATA

mydf <- structure(list(Number = c(420L, 1476L, 10559L, 6794L, 6451L, 
8754L, 8578L, 11655L, 428L, 112L, 477L, 16277L, 17386L, 411L), 
Trial = structure(c(2L, 3L, 8L, 5L, 4L, 7L, 6L, 9L, 2L, 1L, 
2L, 10L, 11L, 2L), .Label = c("NCT00065325", "NCT00091442", 
"NCT00301457", "NCT00917384", "NCT00948675", "NCT01140347", 
"NCT01168973", "NCT01307397", "NCT01358877", "NCT01843374", 
"NCT01905657"), class = "factor"), ID = c(9L, 26L, 34L, 53L, 
53L, 53L, 53L, 53L, 55L, 62L, 62L, 62L, 62L, 66L), Opendate = structure(c(3L, 
9L, 12L, 11L, 13L, 2L, 8L, 10L, 14L, 5L, 6L, 7L, 4L, 1L), .Label = c("1/12/2005", 
"1/19/2011", "1/28/2005", "1/8/2014", "10/15/2003", "11/11/2005", 
"12/16/2013", "12/30/2011", "2/22/2008", "4/2/2012", "5/12/2010", 
"7/28/2011", "8/17/2010", "9/7/2005"), class = "factor"), 
Enrollment = c(0.2, 1, 0.6, 0, 0.3, 0.2, 2.4, 0.3, 0.1, 0.2, 
0.1, 0.2, 0.6, 0)), .Names = c("Number", "Trial", "ID", "Opendate", 
"Enrollment"), class = "data.frame", row.names = c(NA, -14L))