如何结合 ddply 和 ifelse 条件?拆分、转换(如果满足条件并合并数据)?

How to combine ddply with ifelse condition? Split, transform if condition is met & combine data?

我想知道如何将 ddply 与 ifelse 条件结合使用,如以下示例所示,我尝试在某个星期后将 y_added 添加到 y。我希望这是针对每个主题和年份分别完成的,因此我认为 ddply 可能是一个不错的选择,但如果另一个功能效果更好,我会很高兴知道这一点。我看到 similar question 已经有人回答了,但我不知道在这种情况下该怎么做

library(plyr); library(dplyr)
# Example data
year      <- c(rep(2000, 20), rep(2001, 20))
week      <- c(1:10, 1:10, 1:10, 1:10)
subject   <- c(rep("A",10), rep("B", 10), rep("A",10), rep("B", 10))
y         <- c(1:10, 21:30, 11:20, 18:27)

d1 <- data.frame(year, week, subject, y)

d_addition <- data.frame(subject = c("A","B", "A"), y_added = c(5, 12, 7), 
                        week_added = c(5, 7, 8), year = c(2000, 2000, 2001)) 

d2 = full_join(d1, d_addition)

# Attempt to add y_added to y after the week the addition occured
d3 = ddply(d2,c("year", "subject"),transform,
          y2 <- ifelse(week >= y_added, y + y_added,y))

transform 适用于 = 而不适用于 <-。所以将其更改为 = 并且它应该工作

res <- plyr::ddply(d2,c("year", "subject"),transform,
                y2 = ifelse(week >= y_added, y + y_added,y))

因为我们已经在使用 dplyr,整个过程可以用 dplyr 语法完成

library(dplyr)
res2 <- full_join(d1, d_addition) %>% group_by(year, subject) %>% 
             dplyr::mutate(y2 = ifelse(week >= y_added, y+ y_added, y))

all.equal(res, res2, check.attributes = FALSE)
#[1] TRUE