R语言双数据表关联统计:按邮编与时间统计同地区存续银行数量
问题原因
- 你的for循环存在语法错误:
for (row in 1:nrow(Data_firm){缺少右括号,正确写法应为for (row in 1:nrow(Data_firm)){,语法错误会导致代码无法正常执行,得到错误结果。 - 核心逻辑问题:
time、entry、exit三个字段均为字符类型,当时间为多位数时(比如"10"月),字符比较按位对比的规则会出现"10" < "2"的逻辑错误;即使是单个数字的测试场景,如果字段被默认存为因子类型,也会因为因子的内部编码规则导致比较逻辑完全失效。
可行解决方案
方案1:修复原有循环逻辑
先将时间字段转为数值型,再运行修正后的循环:
# 先把所有时间字段转为数值型 Data_firm$time <- as.numeric(Data_firm$time) Data_bank$entry <- as.numeric(Data_bank$entry) Data_bank$exit <- as.numeric(Data_bank$exit) # 修正括号后的循环 for (row in 1:nrow(Data_firm)){ dep <- Data_firm[row, "postal"] time <- Data_firm[row, "time"] count <- sum(Data_bank$Postal_bank == dep & Data_bank$entry <= time & Data_bank$exit > time, na.rm = TRUE) Data_firm[row,"nbbankindepartment"] <- count }
方案2:更高效的向量化运算(适配大型数据集)
如果数据集体量较大,循环执行效率极低,可以用dplyr的连接操作实现需求,运行速度提升非常明显:
library(dplyr) Data_firm <- Data_firm %>% mutate(time = as.numeric(time)) %>% left_join(Data_bank %>% mutate(entry = as.numeric(entry), exit = as.numeric(exit)), by = c("postal" = "Postal_bank")) %>% group_by(Firm, time, postal) %>% summarise(nbbankindepartment = sum(entry <= time & exit > time, na.rm = T), .groups = "drop")
两种方案运行后得到的nbbankindepartment列均符合预期的c(1,2,1)结果。
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

