使用dplyr::mutate计算R中的成对相关性

使用dplyr::mutate计算R中的成对相关性,r,dplyr,correlation,R,Dplyr,Correlation,我有一个很大的数据框,每行上都有足够的数据,可以使用该数据框的特定列计算相关性,并添加一个包含计算出的相关性的新列 下面是我想做的一个总结(这一个使用dplyr): 很明显,它不是这样工作的,因为我在pearsoncor专栏中只得到了NA的,有人有什么建议吗?有没有一个简单的方法可以做到这一点 最好的 几天前我遇到了同样的问题,我知道循环在R中不是最优的,但这是我唯一能想到的: df$r = rep(0,nrow(df)) df$cor_p = rep(0,nrow(df)) for (i i

我有一个很大的数据框,每行上都有足够的数据,可以使用该数据框的特定列计算相关性,并添加一个包含计算出的相关性的新列

下面是我想做的一个总结(这一个使用dplyr):

很明显,它不是这样工作的,因为我在pearsoncor专栏中只得到了
NA的
,有人有什么建议吗?有没有一个简单的方法可以做到这一点

最好的


几天前我遇到了同样的问题,我知道循环在R中不是最优的,但这是我唯一能想到的:

df$r = rep(0,nrow(df))
df$cor_p = rep(0,nrow(df))

for (i in 1:nrow(df)){
  ct = cor.test(as.numeric(df[i,cols_A]),as.numeric(df[i,cols_B]))
df$r[i] = ct$estimate
df$cor_p[i] = ct$p.value
}

几天前我也遇到过同样的问题,我知道循环在R中不是最优的,但这是我唯一能想到的:

df$r = rep(0,nrow(df))
df$cor_p = rep(0,nrow(df))

for (i in 1:nrow(df)){
  ct = cor.test(as.numeric(df[i,cols_A]),as.numeric(df[i,cols_B]))
df$r[i] = ct$estimate
df$cor_p[i] = ct$p.value
}

下面是一个解决方案,它使用
restrape2
包将数据帧分解为长格式,这样每个值都有自己的行。原始的宽格式数据对于6个基因中的每一个每行有60个值,而熔化的长格式数据框有360行,每个值一行。然后我们可以很容易地使用
dplyr
中的
summary()
来计算无循环的相关性

library(reshape2)
library(dplyr)

names1 <- names(example_data)[4:33]
names2 <- names(example_data)[34:63]

example_data_longform <- melt(example_data, id.vars = c('Gene','clusterFR','clusterHR'))

example_data_longform %>%
  group_by(Gene, clusterFR, clusterHR) %>%
  summarize(pearsoncor = cor(x = value[variable %in% names1],
                             y = value[variable %in% names2]))
这将输出一个TIBLE,其中
cor
列是每个基因的
cor.test()
结果列表。我们可以使用
lappy()
从列表中提取输出

lapply(detailed_r$cor, function(x) c(x$estimate, x$p.value))

下面是一个解决方案,它使用
restrape2
包将数据帧分解为长格式,这样每个值都有自己的行。原始的宽格式数据对于6个基因中的每一个每行有60个值,而熔化的长格式数据框有360行,每个值一行。然后我们可以很容易地使用
dplyr
中的
summary()
来计算无循环的相关性

library(reshape2)
library(dplyr)

names1 <- names(example_data)[4:33]
names2 <- names(example_data)[34:63]

example_data_longform <- melt(example_data, id.vars = c('Gene','clusterFR','clusterHR'))

example_data_longform %>%
  group_by(Gene, clusterFR, clusterHR) %>%
  summarize(pearsoncor = cor(x = value[variable %in% names1],
                             y = value[variable %in% names2]))
这将输出一个TIBLE,其中
cor
列是每个基因的
cor.test()
结果列表。我们可以使用
lappy()
从列表中提取输出

lapply(detailed_r$cor, function(x) c(x$estimate, x$p.value))

使用tidyr,您可以分别收集要比较的所有x和y变量。您将获得一个TIBLE,其中包含您提供的每个组合的相关系数及其p值

library(dplyr)
library(tidyr)

example_data %>%
  gather(x_var, x_val, X001_F5_000_A:X030_F5_480_C) %>% 
  gather(y_var, y_val, X031_H5_000_A:X060_H5_480_C) %>% 
  group_by(x_var, y_var) %>% 
  summarise(cor_coef = cor.test(x_val, y_val)$estimate,
            p_val = cor.test(x_val, y_val)$p.value)
几年后编辑、更新:

library(tidyr)
library(purrr)
library(broom)
library(dplyr)

longley %>%
  pivot_longer(GNP.deflator:Armed.Forces, names_to="x_var", values_to="x_val") %>% 
  pivot_longer(Population:Employed, names_to="y_var", values_to="y_val") %>% 
  nest(data=c(x_val, y_val)) %>%
  mutate(cor_test = map(data, ~cor.test(.x$x_val, .x$y_val)),
         tidied = map(cor_test, tidy)) %>% 
  unnest(tidied)

使用tidyr,您可以分别收集要比较的所有x和y变量。您将获得一个TIBLE,其中包含您提供的每个组合的相关系数及其p值

library(dplyr)
library(tidyr)

example_data %>%
  gather(x_var, x_val, X001_F5_000_A:X030_F5_480_C) %>% 
  gather(y_var, y_val, X031_H5_000_A:X060_H5_480_C) %>% 
  group_by(x_var, y_var) %>% 
  summarise(cor_coef = cor.test(x_val, y_val)$estimate,
            p_val = cor.test(x_val, y_val)$p.value)
几年后编辑、更新:

library(tidyr)
library(purrr)
library(broom)
library(dplyr)

longley %>%
  pivot_longer(GNP.deflator:Armed.Forces, names_to="x_var", values_to="x_val") %>% 
  pivot_longer(Population:Employed, names_to="y_var", values_to="y_val") %>% 
  nest(data=c(x_val, y_val)) %>%
  mutate(cor_test = map(data, ~cor.test(.x$x_val, .x$y_val)),
         tidied = map(cor_test, tidy)) %>% 
  unnest(tidied)

它不会工作,因为你没有正确地使用它。请尝试
diag(cor(t(example_data[columnnames])、t(example_data[columnnames]))
或使用
purrr
map2_dbl(as.data.frame(t(example_data[columnnames])、as.data.frame(t(example_data[columnnames])、cor来回答我建议您复习一下您的问题,并试着回答一下。我认为这更像是一个统计问题,而不是为你编写一个。它不会起作用,因为你没有正确地使用它。请尝试
diag(cor(t(example_data[columnnames])、t(example_data[columnnames]))
或使用
purrr
map2_dbl(as.data.frame(t(example_data[columnnames])、as.data.frame(t(example_data[columnnames])、cor来回答我建议您复习一下您的问题,并试着回答一下。我认为这对你来说更像是一个统计问题,而不是编码问题。非常感谢Eudald,我在寻找有效解决方案时使用了类似的循环作为解决方法。使用我的数据集,循环大约需要5分钟才能完成:-/抓取一杯咖啡的完美时间;-)(我会试着想出更有效的方法!)非常感谢Eudald,我在寻找有效的解决方案时使用了类似的循环作为解决方法。使用我的数据集,循环大约需要5分钟才能完成:-/抓取一杯咖啡的完美时间;-)(我会想一些更有效的方法!)是否有一种方法可以只调用一次
cor.test
函数,然后使用
$
评估它们的值?使用purr的map()和broom的tidy()函数确实是可能的。请参见回答的编辑是否有方法只调用一次
cor.test
函数,然后使用
$
评估它们的值?使用purr的map()和broom的tidy()函数确实是可能的。请参见答案的编辑