如何批量将多时间点同类型字符列重编码为数值并区分特殊值?
批量重编码多列实现水果映射
需求说明
需要对一组同格式(不同时间点)的水果列批量执行以下编码规则:
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
相关产品推荐
相关产品推荐

