R语言如何按n列值展开重复行并计算Code与Name的相关性
问题1:按n值生成对应数量的重复行
你可以直接使用tidyr包的uncount()函数实现,一行代码即可完成,不需要手动循环:
library(tidyr) library(dplyr) # 直接按n列的值重复对应行数 df_long <- df %>% uncount(n)
执行后df_long就是你需要的长表,每行会重复n次。
问题2:现有流程合理性和更快捷的方法
现有流程的问题
你当前的流程有两个明显漏洞:
- 你只做了Name的数值转换,Code列现在还是字符串类型(包含"75"、"R009"等非数值内容),直接传入
cor()函数依然会报错 - 如果你要计算的是皮尔逊相关系数,前提是你转成的数值是有实际顺序意义的:比如Name的a~m确实代表从低到高的等级、Code的几个取值也有明确的先后顺序,如果两个都是无序分类变量,硬转数值算出来的皮尔逊相关没有实际解释意义。
无需转长表的快捷方法
你已经有每一组的频数n了,完全可以直接计算加权相关系数,不需要展开成长表,既节省内存效率也更高:
- 如果你确实需要计算皮尔逊相关,直接用加权相关函数即可:
library(dplyr) library(weights) # 先将两个分类变量转成数值,注意factor的levels顺序要符合你的实际业务逻辑 df <- df %>% mutate( Name_num = as.integer(factor(Name, levels = letters[1:13])), Code_num = as.integer(factor(Code, levels = c("75", "R009", "R015", "R019"))) ) # 直接用n作为权重计算相关,不需要展开长表 cor_result <- wtd.cor(x = df$Code_num, y = df$Name_num, weight = df$n)
- 如果你只是想衡量两个分类变量的关联强度,更建议用专门针对分类变量的指标,比如Cramer's V,它的取值范围是0~1,值越大代表两个变量关联越强,不需要你手动给分类变量赋值顺序,更适合无序分类的场景:
library(rcompanion) cramer_v_result <- cramerV(Code ~ Name, data = df, weights = df$n)
内容的提问来源于stack exchange,提问作者hachiko
相关产品推荐
相关产品推荐

