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

如何批量将多时间点同类型字符列重编码为数值并区分特殊值?

批量重编码多列实现水果映射

需求说明

需要对一组同格式(不同时间点)的水果列批量执行以下编码规则:

  • apple → 1,banana → 2,orange → 3,strawberry → 4
  • 非目标水果(如kiwi、apricot)替换为.
  • 原始缺失值<NA>保留为<NA>

示例数据

先构造你提供的原始数据(R语言格式):

df <- tibble(
  id = 1:6,
  Fruit_T1 = c("apple", "banana", "orange", "strawberry", "banana", "orange"),
  Fruit_T2 = c("banana", "apple", "strawberry", "orange", "banana", "apple"),
  Fruit_T3 = c("apple", "strawberry", "kiwi", NA, "apple", "strawberry"),
  Fruit_T4 = c("kiwi", NA, "apple", NA, "apple", "apricot")
)

解决方案1:使用tidyverse(推荐,代码简洁易读)

先加载tidyverse包,通过across函数批量处理目标列:

library(tidyverse)

# 定义水果-数字映射字典
fruit_map <- c("apple" = 1, "banana" = 2, "orange" = 3, "strawberry" = 4)

# 批量处理并生成新列
df_processed <- df %>%
  mutate(
    # 选中所有以Fruit_T开头的列
    across(starts_with("Fruit_T"), 
           # 按规则编码
           ~ case_when(
             is.na(.) ~ NA_character_,          # 保留原始缺失值
             . %in% names(fruit_map) ~ as.character(fruit_map[.]),  # 匹配映射
             TRUE ~ "."                         # 非目标水果替换为.
           ),
           # 新列名规则:在原列名前加R,比如Fruit_T1→RFruit_T1
           .names = "R{col}")
  )

# 查看结果
print(df_processed, n = Inf)

解决方案2:Base R(无需加载第三方包)

如果不想加载外部包,可以用基础R的方法实现:

# 定义映射字典
fruit_map <- c("apple" = 1, "banana" = 2, "orange" = 3, "strawberry" = 4)

# 提取所有需要处理的列名
fruit_cols <- grep("^Fruit_T", names(df), value = TRUE)

# 生成对应的新列名
new_cols <- paste0("R", fruit_cols)

# 循环处理每一列
df[new_cols] <- lapply(df[fruit_cols], function(x) {
  # 先匹配映射规则
  coded <- as.character(fruit_map[x])
  # 将非NA但未匹配到的项替换为.
  coded[is.na(coded) & !is.na(x)] <- "."
  coded
})

# 查看结果
print(df, n = Inf)

最终效果

两种方法都会生成你期望的结果,新列RFruit_T1至RFruit_T4按规则完成编码,保留原始缺失值并标记非目标水果。

内容的提问来源于stack exchange,提问作者user21027866

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:50:37