问题描述
我正在尝试为每个组中的行选择最大数目,并将该数目重新编码为“ Last”,并将其他数字保留为空白(在数据框下方:新变量名称为“ Z”)。之后,我想创建具有与其他变量相对应的多个条件的新变量(在数据框下方:新变量名称为“ X”)。
数据框为:
ID = c(1,1,2,3,4,4)
Care = c("Yes","Yes","No","No")
Y = c(1,2)
Z = c("","","Last","Last")
X = c("","Always","Lost","Linked","Never")
df <- data.frame(ID,Care,Y,Z,X)
df
我可以使用以下代码创建Y:
main <- df %>% group_by(ID) %>% mutate(Y = row_number())
但是,我想在数据框中创建新的变量“ Z”和“ X”。如果每个组内的所有行中的关注为“是”,则为X;如果每个组中的所有行中的关注为“否”,则为X =从不,如果较早时的关注为“是”,而最后一个则为“丢失”,则为“关注”早些时候是或否,但最后一次是=“已链接”
这里我可以创建Z变量(仍然需要创建X):
main %>% group_by(ID) %>% mutate(Z=row_number()>=which.max(Y))
我已经为此苦了一段时间了。任何帮助将不胜感激!
解决方法
容易! :)
您可以节省使用which.max(Y)
的步骤,而只需将每个组中的row_number()
与n()
进行比较。
创建Z
只是一个简单的ifelse
陈述,我认为在创建X
时给您带来的一些麻烦可以通过case_when()
解决,以解决您描述的四种情况。首先,检查组中的all()
观察是否符合您的“是”或“否”的条件,然后再检查两个“混合”情况。
这是您要寻找的:
library(dplyr)
df <- tibble(
ID = c(1,1,2,3,4,4),Care = c("Yes","Yes","No","No")
)
df2 <- df %>%
group_by(ID) %>%
mutate(
Z = ifelse(row_number() == n(),"Last",""),X = case_when(
Z == "" ~ "",all(Care == "Yes") ~ "Always",all(Care == "No") ~ "Never",Care == "Yes" ~ "Linked",Care == "No" ~ "Lost"
)
)