我有以下数据,每个主题有两个观察结果:
SUBJECT <- c(8,8,10,10,11,11,15,15)
POSITION <- c("H","L","H","L","H","L","H","L")
TIME <- c(90,90,30,30,30,30,90,90)
RESPONSE <- c(5.6,5.2,0,0,4.8,4.9,1.2,.9)
DATA <- data.frame(SUBJECT,POSITION,TIME,RESPONSE)
我想要的DATA行包含在向量中的SUBJECT编号,V:
V <- c(8,10,10)
我如何从主题编号为V的DATA中获取两个观察结果,并且重复的次数与V中相应的SUBJECT编号重复的次数相同?
期望的结果:
SUBJECT <- c(8,8,10,10,10,10)
POSITION <- c("H","L","H","L","H","L")
TIME <- c(90,90,30,30,30,30)
RESPONSE <- c(5.6,5.2,0,0,0,0)
OUT <- data.frame(SUBJECT,POSITION,TIME,RESPONSE)
我认为%in%运算符的某些变体可以解决这个问题,但它没有考虑到V中重复的主题数量。即使主题编号在V中列出两次,我只得到相应行的一个副本DATA
我还可以创建一个循环并附加匹配的观察结果,但是这个部分位于一个bootstrap采样器中,这个选项会大大增加计算时间。
答案 0 :(得分:5)
merge
是你的朋友:
merge(list(SUBJECT=V), DATA)
# SUBJECT POSITION TIME RESPONSE
#1 8 H 90 5.6
#2 8 L 90 5.2
#3 10 H 30 0.0
#4 10 L 30 0.0
#5 10 H 30 0.0
#6 10 L 30 0.0
正如@Frank所暗示的,此逻辑可以转换为处理左连接的任何其他内容的data.table
或dplyr
或sql
。