使用类似密钥计算过去的条目

时间:2018-05-28 00:27:51

标签: r

我有这个数据集,它有一个日期和一个ID。我可以添加一个新列,指示存在多少具有相似ID的条目,例如:

dataset1 = dataset1[,count_IDs := .N,by =  ID]

但是,我想计算每个条目只有那一行日期更大的条目。类似于:计算ID相同且日期< =当前行的日期的所有条目,并添加具有该值的列。

ID | Date   | 
1  | 3/4/10 |
1  | 3/6/10 |
1  | 1/2/10 |
2  | 5/5/10 |
2  | 5/6/10 |

结果

ID | Date   | Other columns
1  | 3/4/10 | 1
1  | 3/6/10 | 2
1  | 1/2/10 | 0
2  | 5/5/10 | 0
2  | 5/6/10 | 1

非常感谢!

2 个答案:

答案 0 :(得分:1)

在桌面上进行自我加入,通过.EACHI将每一行与组中的每一行进行比较。添加行计数器(rn)意味着您可以排除比较同一行并影响结果:

dat[, rn := .I ]
dat[dat, on="ID", sum(Date <= i.Date & i.rn != rn), .EACHI]

#   ID V1
#1:  1  1
#2:  1  2
#3:  1  0
#4:  2  0
#5:  2  1

dat的位置:

dat <- data.table(ID = c(1, 1, 1, 2, 2), Date = as.Date(c(14672, 
14674, 14611, 14734, 14735), origin = "1970-01-01"))

答案 1 :(得分:0)

这是一个dplyr解决方案。首先,我从您的数据中创建了一个数据框。请注意两者都是字符类型:

> library(dplyr)
> library(magrittr)
> library(lubridate)
> df <- as.tibble(cbind(identifier,date=date))
> df
# A tibble: 5 x 2
  identifier date  
  <chr>      <chr> 
1 1          3/4/10
2 1          3/6/10
3 1          1/2/10
4 2          5/5/10
5 2          5/6/10

我使用mutate创建了几个中间列,然后将它们放在最后:

> df %>% group_by(identifier) %>% add_tally() %>% mutate(d=mdy(date)) %>% 
      mutate(timeorder=order(d < max(d))) %>% 
      mutate(numprev=n-timeorder) %>% select(identifier,date,numprev)
# A tibble: 5 x 3
# Groups:   identifier [2]
  identifier date   numprev
  <chr>      <chr>    <int>
1 1          3/4/10       1
2 1          3/6/10       2
3 1          1/2/10       0
4 2          5/5/10       0
5 2          5/6/10       1

您可以通过删除最后一个select

来查看中间步骤
> df %>% group_by(identifier) %>% add_tally() %>% mutate(d=mdy(date)) %>%
      mutate(timeorder=order(d < max(d))) %>% mutate(numprev=n-timeorder)
# A tibble: 5 x 6
# Groups:   identifier [2]
  identifier date       n d          timeorder numprev
  <chr>      <chr>  <int> <date>         <int>   <int>
1 1          3/4/10     3 2010-03-04         2       1
2 1          3/6/10     3 2010-03-06         1       2
3 1          1/2/10     3 2010-01-02         3       0
4 2          5/5/10     2 2010-05-05         2       0
5 2          5/6/10     2 2010-05-06         1       1