R - 添加具有取决于天数的访问的列

时间:2017-09-29 21:06:40

标签: r dataframe

我可以使用您的帮助:

我有一个数据框,每个参与者都有“访问”和“研究天数”,因此显示参与者在特定访问中参与研究的天数:

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​​天。

2 个答案:

答案 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