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

在R语言中依据vector_list名称为数据框创建分组列

解决方案

首先修正你创建vector_list的冗余写法(原代码会额外生成全局变量Cereal、Roots等,完全没必要):

vector <- c("WHEA","RICE","MAIZ","BARL","PMIL","SMIL","SORG","OCER","POTA","SWPO","YAMS","CASS","ORTS","BEAN",
            "CHIC","COWP","PIGE","LENT","OPUL","SOYB","GROU","CNUT","BANA","PLNT","TROF","TEMF","VEGE","OILP",
            "SUNF","RAPE","SESA","OOIL","SUGC","SUGB","COTT","OFIB","ACOF","RCOF","COCO","TEAS","TOBA","REST")

vector_list <- list(
  Cereal = vector[1:8],
  Roots = vector[9:13],
  Pulses = vector[14:19],
  oilcr = vector[20:27],
  millet = vector[5:6],
  coffee = vector[32:33],
  fruit = vector[39:40],
  banpl = vector[37:38]
)

Test <- data.frame(A=vector, B = 1:42)

以下是两种可行的给Test添加group列的方法:

方法一:保留所有匹配的组名

如果某个作物属于多个组(比如PMIL同时在Cereal和millet中),此方法会返回所有匹配的组名,用逗号分隔:

Test$group <- sapply(Test$A, function(x) {
  # 筛选出包含当前作物的所有组名称
  matched_groups <- names(vector_list)[sapply(vector_list, function(group) x %in% group)]
  # 有匹配则拼接组名,无匹配返回NA
  if (length(matched_groups) > 0) paste(matched_groups, collapse = ", ") else NA_character_
})

方法二:高效映射(保留最后一个匹配的组名)

先构建一个作物到组的反向映射向量,再直接匹配,适合数据量较大的场景。注意:如果一个作物属于多个组,此方法会保留最后一次赋值的组名:

# 构建作物-组的映射关系
crop_group_map <- unlist(lapply(names(vector_list), function(group_name) {
  setNames(rep(group_name, length(vector_list[[group_name]])), vector_list[[group_name]])
}))

# 给Test添加group列
Test$group <- crop_group_map[Test$A]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:15:26