在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
相关产品推荐
相关产品推荐

