如何在R中循环遍历按年份、政党命名的cosine相似度数据框
错误原因
你之前编写的代码运行失败,是因为y_V_[[i]]是R的列表索引语法,但你所有的原始数据(y_V_2、y_V_3等)都是全局环境下的独立变量,并非y_V_这个列表的元素,运行时无法匹配到对应对象就会报错。
解决方案
你可以通过双重循环同时遍历政党、年份两个维度,用get()读取对应变量、assign()输出处理结果,整个处理逻辑只需要写一次就能完成全量数据处理。
步骤1:定义遍历参数
# 政党列表,和你pivot_longer的列名保持一致 parties <- c("V", "S", "EL", "SF", "DF", "KF", "RV") # 目标年份范围 years <- 2:22
方式1:直接生成独立的输出变量(和你之前的命名习惯一致)
library(tidyr) library(dplyr) for (p in parties) { for (y in years) { # 拼接原始数据的变量名 raw_var <- paste0("y_", p, "_", y) # 读取全局环境中对应的原始数据 tmp <- get(raw_var) # 执行标准化处理 tmp <- as.data.frame(as.matrix(tmp)) tmp <- cbind(id = rownames(tmp), tmp) tmp <- tmp %>% pivot_longer(all_of(parties), names_to = "party", values_to = "cos_sim") %>% filter(party == p) # 拼接输出变量名,写入全局环境 output_var <- paste0("cos_sim_", p, "_", y) assign(output_var, tmp, envir = .GlobalEnv) } }
运行完成后,你就可以直接使用cos_sim_V_2、cos_sim_S_3这类你之前习惯命名的变量。
方式2:结果存入列表(更推荐,避免污染全局环境)
如果你后续需要对所有结果批量操作,建议把所有处理后的数据存在同一个列表中,方便统一调用:
cos_sim_result <- list() for (p in parties) { for (y in years) { raw_var <- paste0("y_", p, "_", y) tmp <- get(raw_var) # 处理逻辑和上文完全一致 tmp <- as.data.frame(as.matrix(tmp)) tmp <- cbind(id = rownames(tmp), tmp) tmp <- tmp %>% pivot_longer(all_of(parties), names_to = "party", values_to = "cos_sim") %>% filter(party == p) # 存入列表,用政党_年份作为索引名 cos_sim_result[[paste0(p, "_", y)]] <- tmp } } # 调用示例:获取V党第2年的处理结果 cos_sim_result[["V_2"]]
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

