我可以使用您的帮助:
我有一个数据框,每个参与者都有“访问”和“研究天数”,因此显示参与者在特定访问中参与研究的天数:
visits <- data.frame(Subj=rep(paste0("S",c(1:3)), each=3),
Visit=rep(paste0("V", c(1:3)), times=3), DaysInStudy =
c(0,8,17,-1,7,15,-1,9,17))
我有另一个数据框,每位参与者每天得分:
set.seed(123)
scores <- data.frame(Subj=rep(paste0("S",c(1:3)), each=27),
DaysInStudy=c(-9:17), scores=sample(9))
我想将分数数据框中的访问次数(V1-V3)添加到访问前6天的所有行(基于DaysInStudy列)。在我的数据中,没有重叠的间隔,间隔之外的天数应设置为NA。
这就是结果应该是这样的:
Subj DaysInStudy scores visit
1 S1 -9 3 NA
2 S1 -8 7 NA
3 S1 -7 9 NA
4 S1 -6 6 V1
5 S1 -5 5 V1
....
10 S1 0 3 V1
11 S1 1 7 NA
12 S1 2 9 V2
我希望我的问题很明确。我确信有一个简单的解决方案,但我现在想不到任何问题。谢谢您的帮助!
编辑:我想出了类似的东西:
scores$visit <- visits$Visit[match(paste(scores$Subj, scores$DaysInStudy), paste(visits$Subj, visits$DaysInStudy))]
scores %>%
mutate(visit1 = lead(visit), visit2 = lead(visit,2), visit3 = lead(visit,3), visit4 = lead(visit,4),
visit5 = lead(visit,5), visit6 = lead(visit,6),
visit = coalesce(visit, visit1, visit2, visit3, visit4, visit5, visit6)) %>%
select(-c(visit1, visit2, visit3, visit4, visit5, visit6))
然而,这不是一个完美的解决方案,因为在我的实际数据集中,我有一天有更多的测量值,所以我想将访问添加到所有行,其中DaysInStudy等于访问的DaysInStudy和提前6天。
答案 0 :(得分:1)
您需要加入特定条件,例如使用sqldf
:
sqldf:::sqldf({"
SELECT s.*, v.Visit
FROM scores s
LEFT JOIN visits v on
s.Subj = v.subj and
s.DaysInStudy >= v.DaysInStudy - 6 and
s.DaysInStudy <= v.DaysInStudy"})
# Subj DaysInStudy scores Visit
# 1 S1 -9 3 <NA>
# 2 S1 -8 7 <NA>
# 3 S1 -7 9 <NA>
# 4 S1 -6 6 V1
# 5 S1 -5 5 V1
# 6 S1 -4 1 V1
# 7 S1 -3 2 V1
# 8 S1 -2 8 V1
# 9 S1 -1 4 V1
# 10 S1 0 3 V1
# 11 S1 1 7 <NA>
答案 1 :(得分:0)
让我们使用神奇的SELECT * FROM Restaurants WHERE RNum IN (SELECT RNum FROM Orders GROUP BY RNum HAVING Sum(IIf([CNum]<>'C200',1,0))=0);
dplyr