我需要能够按列计算数据帧的相关系数。例如,我的数据框是:
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"]))
我有什么想法可以做到这一点?
答案 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