如何结合 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
我想知道如何将 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