R中按Action分组快速计算Difficulty与多变量的相关性
问题需求
基于数据框df,筛选出Action包含"Field"的行,按Action分组后,计算每组中Difficulty与strings、characters、POS、NEG、NEU各变量的相关性,寻求高效的单命令实现方式。
原代码错误原因
你之前的代码报错主要有两个原因:
summarise_all(funs(cor))会对每个变量单独调用cor(),但cor()需要至少两个变量才能计算相关性,没有指定和Difficulty关联,逻辑不成立;- 部分分组(如"Field or Catch"、"Field or Ball"、"Field and run")只有1条数据,单样本无法计算相关系数,会触发错误。
解决方案
方法1:宽格式输出(保留原变量列)
使用dplyr的across()函数遍历目标变量,逐个计算与Difficulty的相关性,同时处理单样本分组的情况:
library(dplyr) library(stringr) df %>% filter(str_detect(Action, "Field")) %>% na.omit() %>% group_by(Action) %>% summarise( across( .cols = c(strings, characters, POS, NEG, NEU), .fns = ~ if(n() >= 2) cor(Difficulty, .x) else NA_real_, .names = "cor_{.col}" ) )
across()批量处理指定变量,.names参数自动生成带前缀的列名,更清晰;- 通过
if(n() >= 2)判断分组样本数,单样本时返回NA避免报错。
方法2:长格式输出(更易查看分组-变量的对应关系)
先将数据转成长格式,再分组计算相关性,结果结构更直观:
library(dplyr) library(stringr) library(tidyr) df %>% filter(str_detect(Action, "Field")) %>% na.omit() %>% pivot_longer( cols = c(strings, characters, POS, NEG, NEU), names_to = "Variable", values_to = "Value" ) %>% group_by(Action, Variable) %>% summarise( Correlation = if(n() >= 2) cor(Difficulty, Value) else NA_real_, .groups = "drop" )
pivot_longer()将多列变量转换为"变量名-值"的键值对形式;.groups = "drop"取消分组,最终结果为扁平化的数据框,便于后续分析或可视化。
结果说明
- 只有
Action = "Field"的分组有2条数据,能计算出有效相关系数; - 其余分组因仅1条数据,相关性结果返回
NA(符合统计逻辑)。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

