data.table按id重复条件值

时间:2018-05-08 21:20:59

标签: r data.table

我有一个这样的数据表:

library(data.table)
group <- c("a","a","a","a","a","a")
id <- c("1232","1232","1232","1232","1232","1232")
response <- c("a","b","c","d","e","f")
score <- c(2,1,3,4,2,5)

df <- cbind.data.frame(group,id,response,score)
setDT(df)

 group   id response score
     a 1232        a     2
     a 1232        b     1
     a 1232        c     3
     a 1232        d     4
     a 1232        e     2
     a 1232        f     5

分数仅适用于响应为“a”的行。我想创建这样的东西,其中每个行的分数由id显示:

  group   id response score ares
     a 1232        a     2  2
     a 1232        b     1  2
     a 1232        c     3  2
     a 1232        d     4  2
     a 1232        e     2  2
     a 1232        f     5  2

我已经尝试创建一个行索引并仅拉动响应的行,然后通过id将其连接回原始数据表,但是,这似乎效率很低。有没有办法只使用data.table语法来避免昂贵的连接?

1 个答案:

答案 0 :(得分:2)

您可以按id进行分组,然后将条件值(响应为a的分数)分配给新列:

df[, ares := score[response == 'a'][1], id][]

#   group   id response score ares
#1:     a 1232        a     2    2
#2:     a 1232        b     1    2
#3:     a 1232        c     3    2
#4:     a 1232        d     4    2
#5:     a 1232        e     2    2
#6:     a 1232        f     5    2

根据您的实际数据,您也可以执行df[, ares := score[response == 'a'], id][]。请注意,如果有多个响应为a,则第一个选项会选择第一个分数,第二个选项会循环响应等于a的所有分数。