R data.table 条件在组内,但在组中的第一个实例中记录

标签 r data.table

我的数据看起来有点像这样:

df <- data.frame(ID=c(rep(1,4),rep(2,2),rep(3,2),4), TYPE=c(1,3,2,4,1,2,2,3,2),
                 SEQUENCE=c(seq(1,4),1,2,1,2,1))

ID  TYPE  SEQUENCE
1   1     1
1   3     2
1   2     3
1   4     4
2   1     1
2   2     2
3   2     1
3   3     2
4   2     1

我知道需要检查每个ID block (二进制)中是否存在某种类型,但只记录 在每个 block 的第一条记录中回答(SEQUENCE == 1)。

到目前为止,我想到的最好的方法是将它们编码在它们所在的行中,例如

library(data.table)
DT <- data.table(df)
DT$A[DT$TYPE==1] <- 1
DT$B[DT$TYPE==2] <- 1
DT$C[DT$TYPE==3] <- 1
DT$D[DT$TYPE==4] <- 1
DT[is.na(DT)] <- 0

结果:

ID  TYPE  SEQUENCE  A B C D
1   1     1         1 0 0 0
1   3     2         0 0 1 0
1   2     3         0 1 0 0
1   4     4         0 0 0 1
2   1     1         1 0 0 0
2   2     2         0 1 0 0
3   2     1         0 1 0 0
3   3     2         0 0 1 0
4   2     1         0 1 0 0

但是,结果应该如下所示:

ID  TYPE  SEQUENCE  A B C D
1   1     1         1 1 1 1
1   3     2         0 0 0 0
1   2     3         0 0 0 0
1   4     4         0 0 0 0
2   1     1         1 1 0 0
2   2     2         0 0 0 0
3   2     1         0 1 1 0
3   3     2         0 0 0 0
4   2     1         0 1 0 0

我认为这可以通过 data.table 来完成,但我还没有找到正确的语法。

最佳答案

这会生成 data.table 的一份副本:

DT[, FAC := factor(TYPE, labels=LETTERS[1:4])]

DT <- dcast.data.table(DT, ID+TYPE+SEQUENCE~FAC, fun.aggregate=length)
DT[,LETTERS[1:4] := lapply(.SD, 
                           function(x) c(any(as.logical(x)), rep(0L, length(x)-1))),
   .SDcols=LETTERS[1:4], by=ID]
#   ID TYPE SEQUENCE A B C D
#1:  1    1        1 1 1 1 1
#2:  1    2        3 0 0 0 0
#3:  1    3        2 0 0 0 0
#4:  1    4        4 0 0 0 0
#5:  2    1        1 1 1 0 0
#6:  2    2        2 0 0 0 0
#7:  3    2        1 0 1 1 0
#8:  3    3        2 0 0 0 0
#9:  4    2        1 0 1 0 0

关于R data.table 条件在组内,但在组中的第一个实例中记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22403341/

相关文章:

r - 在 R 中将不规则数据转换为可用格式

r - R中的另一列对多个(70)列的操作

python - 简单数据操作 : R vs python

r - 在带有 data.table 的函数中使用 by

r - 为什么plyr这么慢?

r - 使用dplyr获取基本统计数据(min、mean、max、sd)?

r - R中向量的subset()

R:从深度嵌套的 XML 文件中将 XML 节点值提取到数据帧中

r - 在 group_by 之后连接表

R 数据表优化。 overdraw 财务数据