2016-06-18 5 views
3

Ich möchte Korrelationen, p-Werte und 95% CI zwischen einer bestimmten Spalte und allen anderen Spalten in einem Datenframe finden. Das "Besen" -Paket bietet ein Beispiel, wie das zwischen zwei Spalten mit cor.test mit dplyr und Pipes zu tun ist. Für mtcars und, sagen wir, mpg Spalte können wir eine Korrelation mit einer anderen Säule laufen gelassen:R: Wie kann man eine Funktion anwenden, die einen Datenrahmen für mehrere Spalten ausgibt (mit dplyr)?

library(dplyr) 
library(broom) 
mtcars %>% do(tidy(cor.test(.$mpg, .$cyl))) 

estimate statistic  p.value parameter conf.low conf.high 
1 -0.852162 -8.919699 6.112687e-10  30 -0.9257694 -0.7163171 

Die Ausgabe ist eine einreihige Datenrahmen. Ich möchte cor.test für mpg mit jeder Spalte ausführen und die Ausgabe an eine separate Zeile senden. Wenn mpg Spalte mit jeder anderen Spalte gekoppelt ist, würde die gewünschte Ausgabe wie folgt aussehen:

estimate statistic  p.value parameter conf.low  conf.high 
cyl -0.852162 -8.919699 6.112687e-10  30 -0.9257694 -0.7163171 
disp -0.8475514 -8.747152 9.380327e-10  30 -0.9233594 -0.7081376 
hp -0.7761684 -6.742389 1.787835e-07  30 -0.8852686 -0.5860994 
drat 0.6811719 5.096042 1.77624e-05  30 0.4360484 0.832201 
wt -0.8676594 -9.559044 1.293959e-10  30 -0.9338264 -0.7440872 
qsec 0.418684 2.525213 0.01708199   30 0.08195487 0.6696186 
vs 0.6640389 4.864385 3.415937e-05  30 0.410363 0.8223262 
am 0.5998324 4.106127 0.0002850207  30 0.3175583 0.784452 
gear 0.4802848 2.999191 0.005400948  30 0.1580618 0.7100628 
carb -0.5509251 -3.61575 0.001084446  30 -0.754648 -0.2503183 

Hinweis die zusätzlichen Zeilennamen in der ersten Spalte. Sie zeigen an, welche Spalte mit mpg für den cor.test gepaart wurde. Im Idealfall möchte ich das mit dplyr und Pipes machen.

Antwort

5

Hier ist eine Lösung, die mit der do Ansatz bleibt. Der Schritt, den Sie verpassen, besteht darin, Ihre Daten zu sammeln und dann nach der Variablen zu gruppieren.

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

mtcars %>% 
    gather(var, value, -mpg) %>% 
    group_by(var) %>% 
    do(tidy(cor.test(.$mpg, .$value))) %>% 
    ungroup() %>% 
    mutate(var = factor(var, names(mtcars)[-1])) %>% 
    arrange(var) 

Und hier ist ein Beispiel, das entlang der Basis R Ansatz ist (obwohl ich Rohre der Einfachheit halber verwendet, aber es ist leicht anpassbar)

library(dplyr) 
library(broom) 

xvar <- "mpg" 
yvar <- names(mtcars)[!names(mtcars) %in% xvar] 

lapply(yvar, 
     function(yvar, xvar, DF) 
     { 
     cor.test(DF[[xvar]], DF[[yvar]]) %>% 
      tidy() 
     }, 
     xvar, 
     mtcars) %>% 
    bind_rows() %>% 
    mutate(yvar = yvar) %>% 
    select(yvar, estimate:conf.high) 
+0

Danke, @Bejnamin, für eine solche prägnante und klare Lösung ! Wie ich verstehe, erreichen Sie das Hauptziel mit nur drei Rohren: mtcars%>% sammeln (var, value, -mpg)%>% group_by (var)%>% do (sauber (cor.test (. $ mpg,. $ value)). Der Rest des Codes ist nur nach var. – Irakli

+0

zu sortieren Ja, das ist richtig.Es ist nur eine Frage von, ob Sie sie in der gleichen Reihenfolge wollen, wie sie erscheinen, ich die ursprünglichen Daten – Benjamin

Verwandte Themen