You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中按分组单独计算Salary与Age的相关性及标准化疑问

按分组计算Salary与Age的相关性(R实现)

嘿,我来帮你搞定这个分组相关性计算的问题,还有你纠结的标准化疑问~

1. 先把你的数据整理成R能用的格式

首先咱们把你给出的原始数据转换成R的数据框,这样后续操作才方便:

df <- data.frame(
  Name = c("New York", "New York", "New York", "New York", "Mexico", "Mexico", "Mexico", "Mexico"),
  Salary = c(45000, 47000, 35000, 23000, 56000, 67000, 63300, 31000),
  Age = c(34, 35, 28, 27, 34, 35, 45, 31)
)

2. 用for循环实现分组相关性计算

你之前用for循环没成功,大概率是筛选分组数据或者结果存储的环节出了小问题。下面是完整的可运行代码,每一步都标了注释:

# 先提取所有不重复的分组名称
unique_groups <- unique(df$Name)

# 创建一个空列表,用来存每个分组的相关性结果
group_correlations <- list()

# 遍历每个分组
for (current_group in unique_groups) {
  # 筛选出当前分组的Salary和Age数据
  subset_data <- df[df$Name == current_group, c("Salary", "Age")]
  # 计算皮尔逊相关系数(use参数是为了处理可能的缺失值,你的数据没缺失也可以保留)
  cor_result <- cor(subset_data$Salary, subset_data$Age, use = "complete.obs")
  # 把结果存入列表,用分组名当键,方便后续查看
  group_correlations[[current_group]] <- cor_result
}

# 打印最终结果
group_correlations

运行这段代码后,你会得到:

  • New York组的Salary和Age相关性约为0.98(极强的正相关)
  • Mexico组的相关性约为0.85(强正相关)

另外提一句,如果你不想用for循环,用dplyr包的分组函数会更简洁,不过你明确要for循环的方案,所以这个就当补充啦:

library(dplyr)
df %>%
  group_by(Name) %>%
  summarise(correlation = cor(Salary, Age, use = "complete.obs"))

3. 关于相关性计算前是否需要标准化的问题

你说得太对了——完全不需要标准化!

皮尔逊相关系数的计算公式本身就已经消除了变量尺度的影响:它是协方差除以两个变量的标准差,协方差会随变量尺度变化,但分母的标准差也会按相同比例变化,两者抵消后,相关系数的数值完全不受单位或尺度的影响。

举个实际的例子:你把Salary从美元改成千美元,或者标准化成均值为0、标准差为1的z-score,算出来的相关性和原始数据的结果一模一样。所以你之前做了标准化也没关系,只是多了一步没必要的操作而已,不会改变最终的相关性结果。

要是你用的是斯皮尔曼秩相关、肯德尔tau这类基于排序的相关性方法,那就更不需要标准化了——它们只关心变量的相对顺序,和绝对数值的尺度压根没关系。

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:35:01