You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:58:57