2017-12-31 78 views
0

Ich habe einen großen Datenrahmen mit auf jeder Zeile genug Daten, um eine Korrelation mit bestimmten Spalten dieses Datenrahmens zu berechnen und eine neue Spalte mit den berechneten Korrelationen hinzufügen. HierBerechnen Sie paarweise Korrelation in R mit dplyr :: muate

ist eine Zusammenfassung dessen, was Ich mag würde tun (dieses mit dplyr):

example_data %>% 
mutate(pearsoncor = cor(x = X001_F5_000_A:X030_F5_480_C, y = X031_H5_000_A:X060_H5_480_C)) 

Offensichtlich ist es nicht funktioniert auf diese Weise, wie ich nur NA's in der pearsoncor Spalte bekommen, hat jemand eine hat Vorschlag? Gibt es einen einfachen Weg, dies zu tun?

Best,

Example data frame

+0

Es würde nicht funktionieren, weil Sie es nicht richtig verwenden. Versuchen Sie 'diag (cor (t (example_data [spaltennamen]), t (example_data [spaltennamen])))' Oder mit 'purrr'' map2_dbl (as.data.frame (t (example_data [spaltennamen])), as.data .frame (t (example_data [spaltennamen])), cor) ' – akrun

+0

Ich empfehle Ihnen, Ihre Frage zu überprüfen und versuchen, eine Antwort auf https://stats.stackexchange.com zu erhalten. Ich denke, es ist mehr ein statistisches Problem, als für Sie zu programmieren. –

Antwort

0

hatte ich das gleiche Problem ein paar Tage zurück, und ich weiß, Schleifen sind in R nicht optimal, aber das ist das einzige, was ich denken konnte:

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 
} 
+0

Vielen Dank Eudald, ich benutzte eine ähnliche Schleife als Workaround bei der Suche nach einer effizienten Lösung. Mit meinem Datensatz dauert die Schleife ca. 5 Minuten: -/ – user2259380

+0

Perfekte Zeit, um eine Tasse Kaffee zu holen ;-) (Ich versuche mir etwas Effizienteres auszudenken!) – Eudald

0

Hier ist eine Lösung mit dem reshape2 Paket zu melt() der Datenrahmen in lange Form, so dass jeder Wert eine eigene Zeile hat. Die ursprünglichen Wide-Form-Daten haben 60 Werte pro Reihe für jedes der 6 Gene, während der geschmolzene Langform-Datenrahmen 360 Reihen hat, eine für jeden Wert. Dann können wir einfach summarize() von dplyr verwenden, um die Korrelationen ohne Schleifen zu berechnen.

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])) 

Sie könnten auch detailliertere Ergebnisse, wie in Eudald Antwort erzeugen, mit do():

detailed_r <- example_data_longform %>% 
    group_by(Gene, clusterFR, clusterHR) %>% 
    do(cor = cor.test(x = .$value[.$variable %in% names1], 
        y = .$value[.$variable %in% names2])) 

Dies gibt einen tibble mit der cor Spalte eine Liste mit den Ergebnissen der cor.test() für jedes Gen sein. Wir können verwenden, um die Ausgabe aus der Liste zu extrahieren.

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