我有这个数据集,它有一个日期和一个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
非常感谢!
答案 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