如何计算数据框中某些列的相关性?

时间:2016-12-21 14:30:10

标签: r

我需要能够按列计算数据帧的相关系数。例如,我的数据框是:

dput(df)
structure(list(Server = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L), 
.Label = c("server101", "server102"), class = "factor"), 
JVM = structure(c(1L, 2L, 3L, 4L, 2L, 3L, 4L), 
.Label = c("JVM1", "JVM2", "JVM3", "JVM4"), 
class = "factor"), cpu = c(10L, 20L, 30L, 20L, 10L, 20L, 20L), 
trans = c(1000L, 2000L, 30L, 30L, 50L, 60L, 30L)),  
.Names = c("Server", "JVM", "cpu", "trans"), 
class = "data.frame", row.names = c(NA, -7L))

我需要能够计算每个jvm和服务器的cpu和trans之间的系数的相关性。

我试过这个:

apply(df[,c('trans','cpu')], function(x) FUN=cor(x["trans"],x["cpu"]))

我有什么想法可以做到这一点?

3 个答案:

答案 0 :(得分:2)

有一种基本的R方法可以做到这一点,但我可能会使用dplyr

如果您的数据框名为structure,请尝试以下操作:

library(dplyr)
structure %>% group_by(JVM) %>% summarize(cor = cor(trans,cpu))

答案 1 :(得分:2)

我们可以使用data.table

library(data.table)
setDT(df)[, .(Cor = cor(trans,cpu)), by = JVM]

答案 2 :(得分:1)

您无法从一个数据点获取相关性,但假设您的实际数据每个服务器/ jvm有更多数据点,请尝试使用此代码。它不使用任何包:

out <- tapply(1:nrow(df), df[1:2], function(i) with(df[i, ], cor(cpu, trans)))

,并提供:

> out
           JVM
Server      JVM1 JVM2 JVM3 JVM4
  server101   NA   NA   NA   NA
  server102   NA   NA   NA   NA

如果你喜欢长形式,那么:

ftable(out, row.vars = 1:2)

,并提供:

Server    JVM     
server101 JVM1  NA
          JVM2  NA
          JVM3  NA
          JVM4  NA
server102 JVM1  NA
          JVM2  NA
          JVM3  NA
          JVM4  NA