仅选择最大数量并重新编码最大,并在数据框中将其他字段保留为空白,并使用多个变量的多个条件重新编码

问题描述

我正在尝试为每个组中的行选择最大数目,并将该数目重新编码为“ 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"
    )
  )

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...