如何在RStudio中将二状态因子数据框转换为三状态因子数据框
在R中实现二状态因子到三状态因子的转换
示例输入数据
首先构造和你提供的结构一致的测试数据:
df <- data.frame( ID = c(90500974, 90500974, 90500974, 90500974, 90500974, 90500975, 90500975, 90500975, 90500975, 90500975), STATE = c(1, 2, 1, 1, 2, 1, 2, 2, 1, 2), AGE = rep(17, 10), W_NO = c(1,2,3,4,5,1,2,3,4,5) )
方法一:使用dplyr(tidyverse生态)
适合习惯tidyverse语法的用户,代码可读性强:
library(dplyr) df_transformed <- df %>% group_by(ID) %>% mutate( # 标记当前行及之前是否出现过STATE=2 has_state2 = cumsum(STATE == 2) > 0, # 按规则转换STATE:已出现2后的1转为3,其余保持原值 STATE = case_when( has_state2 & STATE == 1 ~ 3, TRUE ~ STATE ) ) %>% select(-has_state2) %>% # 移除临时辅助列 ungroup() # 查看转换后的数据 print(df_transformed)
方法二:使用base R(无需额外安装包)
适合不想加载第三方包的场景:
# 按ID拆分数据框,逐个处理后合并 df_transformed_base <- do.call(rbind, lapply(split(df, df$ID), function(group) { # 生成标记:是否已经出现过STATE=2 has_state2 <- cumsum(group$STATE == 2) > 0 # 替换符合条件的STATE值 group$STATE[has_state2 & group$STATE == 1] <- 3 return(group) })) # 重置自动生成的行名 rownames(df_transformed_base) <- NULL # 查看转换后的数据 print(df_transformed_base)
两种方法都会得到你需要的结果:每个ID下,首次出现STATE=2之后的所有STATE=1都会被替换为3,其余状态保持不变。
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

