在R中计算数据框中的相关性

4

我有一个数据框d,它有3列,分别是s, n, id。我需要根据它们的"id"计算"s"和"n"之间的相关性。

例如数据框:

"s"   "n"   "id"
1.6    0.5   2
2.5    0.8   2
4.8    0.7   3
2.6    0.4   3
3.5    0.66  3
1.2    0.1   4
2.5    0.45  4

所以,我想计算2、3和4的相关性,并将其作为向量返回,例如:

cor
0.18 0.45 0.65

我的问题是如何选择这些id并计算相关性,并以向量形式返回。谢谢。

你的示例输出似乎与你的样本数据不匹配,对吗?所有答案都提供了一致但不同的结果。 - talat
是的,我只是举了一个例子来展示我想要的结果。 - Raja Raghudeep Emani
4个回答

3

以下是dplyr的处理方法:

library(dplyr)
group_by(df, id) %>% summarise(corel = cor(s, n)) %>% .$corel
#[1] 1.000000 0.875128 1.000000

1
太好了!顺便说一下,如果你想要一个数据框作为结果,你可以只需删除上面代码中的最后一个 %>% .$corel 部分。 - talat

2
也许你可以尝试一下。
unname(c(by(df[,-3], list(df$id), FUN=function(x) cor(x)[2])))
#[1] 1.000000 0.875128 1.000000

或者

 unname(sapply(by(df[,-3], list(df$id), FUN=cor),`[`,2))
 #[1] 1.000000 0.875128 1.000000

或者

library(data.table)
setDT(df)[,cor(s,n) , by=id]$V1
#[1] 1.000000 0.875128 1.000000

数据

df <-  structure(list(s = c(1.6, 2.5, 4.8, 2.6, 3.5, 1.2, 2.5), n = c(0.5, 
0.8, 0.7, 0.4, 0.66, 0.1, 0.45), id = c(2L, 2L, 3L, 3L, 3L, 4L, 
4L)), .Names = c("s", "n", "id"), class = "data.frame", row.names = c(NA, 
-7L))

2
tab_split<-split(mydf,mydf$id) # get a list where each element is a subset of your data.frame with the same id

unlist(lapply(tab_split,function(tab) cor(tab[,1],tab[,2]))) # get a vector of correlation coefficients

使用您提供的示例:

mydf<-structure(list(s = c(1.6, 2.5, 4.8, 2.6, 3.5, 1.2, 2.5), 
                     n = c(0.5,0.8, 0.7, 0.4, 0.66, 0.1, 0.45), 
                     id = c(2L, 2L, 3L, 3L, 3L, 4L,4L)), 
                .Names = c("s", "n", "id"), 
                class = "data.frame", 
                row.names = c(NA, -7L))

> unlist(lapply(tab_split,function(tab) cor(tab[,1],tab[,2])))
       2        3        4 
1.000000 0.875128 1.000000

NB: 如果你的列名总是 "n" 和 "s",你也可以这样做
unlist(lapply(tab_split,function(tab) cor(tab$s,tab$n)))

0
一个循环选项(尽管它可能比其他解决方案慢)。如果你只想包含特定的身份,你应该调整向量d,相关性将在向量v中返回。
d <- unique(mydf$id)
v <- vector("numeric", length = length(d))

for(i in seq_along(d)) {
  dat <- mydf[ which(mydf$id == d[i]), ]
  v[i] <- cor(dat$s, dat$n)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接