R语言统计df1匹配df2每行的行数,for循环运行出错如何解决
问题分析与解决方法
你的for循环存在的问题
- 每次循环都重复初始化
b变量:你在循环内部写了b<- data.frame('NA','NA'),每一轮循环都会把b重置为只有1行2列的空数据框,逻辑完全错误 - 没有提前初始化
num向量:R中如果没有提前定义num的长度,循环中动态赋值很容易出现不可预期的结果,你得到的长度为8的异常输出就是这个原因导致的 - 存在无意义的冗余操作:你不需要把匹配结果存到
b里再统计行数,直接统计匹配结果的行数即可
正确实现方法
修正后的for循环版本
library(tidyverse) # 提前初始化num向量,长度和df2的行数一致 num <- integer(nrow(df2)) # 显式指定连接键避免警告,也让逻辑更清晰 for(i in 1:nrow(df2)) { num[i] <- nrow(inner_join(df1, df2[i,], by = c("Measures", "Format"))) }
你提供的示例数据运行后得到的结果为 18 6 7 2,即df2第一行在df1中匹配到18行,第二行匹配到6行,以此类推。
更简洁的tidyverse向量化写法(无需循环)
用分组计数+匹配的方式实现,代码更短、性能更好:
library(tidyverse) num <- df1 %>% # 统计df1中每个(Measures, Format)组合的出现次数 count(Measures, Format) %>% # 和df2匹配,保留df2的行顺序 right_join(df2, by = c("Measures", "Format")) %>% # 提取计数字段转为向量 pull(n)
运行结果和修正后的循环完全一致。
内容的提问来源于stack exchange,提问作者ujjwal tyagi
相关产品推荐
相关产品推荐

