我有一个这样的数据表:
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语法来避免昂贵的连接?
答案 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
的所有分数。