2016-05-13 10 views
3

ich einen Datensatz der Form haben:aus Bins eines Plots

d = data.frame(seq(0.01,1,by=0.01), c(seq(0.27,0.1,-0.01),seq(0.1,0.5,0.01),seq(0.5,0.1,-0.01))) 
names(d) = c("X","Y") 
ggplot(d, aes(x=X, y=Y)) + geom_line() 

Ich versuche, eine Übersichtstabelle zu erzeugen, die die Y Variable in gleiche Gruppen von jeweils 10% bins und erzeugen die Auswertungsstatistik von X für jeden Behälter. Das ist, wie ich mein Ergebnis gerne wie folgt aussehen:

Y Group X Group 
0-10%  {Range1: 10-30%, mean1, median1, sd1} {Range2: 85-100%, mean2, median2, sd2} 
10-20%  ... 
20-30%  ... 
30-40%  ... 
40-50%  ...  

Die Bereiche der X sind nicht immer zwei, 20-30% der Y hat drei Bereiche von X und 40-50% hat eine.

Ich habe viele große Datensätze, auf denen dies implementiert werden muss. Die Daten dienen zur Reproduktion des Problems. Meine tatsächlichen Daten könnten viele Wendepunkte haben, da dieser Code auf vielen Kombinationen von X und Y ausgeführt werden muss.

+1

Was haben Sie versucht? Warum hat es nicht funktioniert? – Heroka

+0

Ich habe eine For-Loop-Lösung geschrieben und kämpfe immer noch mit der Automatisierung des Codes. Auf SO für eine schnellere Datenstrukturlösung. – Divi

Antwort

1

Ausgabe nicht wie Ihre formatiert.

Aber hier ist eine enge Lösung. Sie können sie einfach nach Ihren Wünschen formatieren. Es scheint, dass Sie Y in 10 Gruppen gruppieren, aber nicht sicher auf X. Ich verwende auch 10 Gruppen auf X.

d = data.frame(seq(0.01,1,by=0.01), c(seq(0.27,0.1,-0.01),seq(0.1,0.5,0.01),seq(0.5,0.1,-0.01))) 

names(d) = c("X","Y") 

library(dplyr) 

d$x.decile<-ntile(d$X,10) 
d$y.decile<-ntile(d$Y,10) 


summary<-data.frame(d%>%group_by(y.decile, x.decile)%>%summarise(mean=mean(X),median=median(X), min=min(X), max=max(X), sd=sd(X))) 

> summary 
    y.decile x.decile mean median min max   sd 
1   1  2 0.175 0.175 0.15 0.20 0.018708287 
2   1  3 0.210 0.210 0.21 0.21   NaN 
3   1  10 0.990 0.990 0.98 1.00 0.010000000 
4   2  2 0.135 0.135 0.13 0.14 0.007071068 
5   2  3 0.235 0.235 0.22 0.25 0.012909944 
6   2  10 0.955 0.955 0.94 0.97 0.012909944 
7   3  1 0.095 0.095 0.09 0.10 0.007071068 
+0

Ja, soweit sollte das funktionieren. Ich arbeite immer noch daran, es zu testen und das Ergebnis in meinem Format zu bekommen. – Divi

0

Die quantile und aggregate Funktionen können Ihnen helfen.

# Create data frame 
d <- data.frame(seq(0.01,1,by=0.01), c(seq(0.27,0.1,- 0.01),seq(0.1,0.5,0.01),seq(0.5,0.1,-0.01))) 
names(d) <- c("X","Y") 

# Define bins 
bins <- quantile(d$Y, seq(0.1,1,length.out=10)) 

# Create indicator variable for which bin each Y belongs in 
ag <- c() 
for (i in 1:nrow(d)) {ag[i] <- which(d$Y[i] < bins)[1]} 

# Compute summary statistics 
means <- aggregate(d$X, by=list(ag), mean) 
medians <- aggregate(d$X, by=list(ag), median) 
variances <- aggregate(d$X, by=list(ag), var) 

# Put them all into a new data frame 
data.frame(group=(1:10),mean=means[,2], median=medians[,2], variance=variances[,2]) 

## group  mean median variance 
##1  1 0.4533333 0.200 0.162250000 
##2  2 0.4709091 0.240 0.148969091 
##3  3 0.3990000 0.265 0.134543333 
##4  4 0.4650000 0.305 0.139583333 
##5  5 0.3525000 0.325 0.114278571 
##6  6 0.4983333 0.385 0.097178788 
##7  7 0.5950000 0.595 0.034250000 
##8  8 0.5950000 0.595 0.017583333 
##9  9 0.5950000 0.595 0.006472222 
##10 10 0.5950000 0.595 0.001171429 
1

Sie können das Format erhalten Sie mit melt und dcast vom reshape Paket wünschen.

Im folgenden Code habe ich die Daten in 10 Y-Gruppen und 2 X-Gruppen geschnitten, nur um die Breite der Ausgabe vernünftig zu halten. Ändern Sie 2 in 10 in der Funktion ntile, um tatsächliche Dezile für X zu erhalten. Ich habe auch nicht alle zusammenfassenden Artikel aufgeführt, aber der folgende Code wird Ihnen hoffentlich helfen, zusätzliche Informationen hinzuzufügen.

library(dplyr) 
library(reshape2) 

sm = d %>% group_by(`Y decile`=ntile(Y,10), X.decile=ntile(X,2)) %>% 
    summarise(`X decile` = paste0("{Count: ", n(), ", Range: ", min(X),"-",max(X),", Median: ",median(X),"}")) 

sm %>% melt(id.var=c("Y decile","X.decile")) %>% 
    dcast(`Y decile` ~ variable + X.decile, value.var="value", fill="") 
Y decile         X decile_1         X decile_2 
1   1 {Count: 7, Range: 0.15-0.21, Median: 0.18}  {Count: 3, Range: 0.98-1, Median: 0.99} 
2   2 {Count: 6, Range: 0.13-0.25, Median: 0.225} {Count: 4, Range: 0.94-0.97, Median: 0.955} 
3   3 {Count: 7, Range: 0.09-0.28, Median: 0.12} {Count: 3, Range: 0.91-0.93, Median: 0.92} 
4   4 {Count: 6, Range: 0.06-0.31, Median: 0.185} {Count: 4, Range: 0.87-0.9, Median: 0.885} 
5   5 {Count: 8, Range: 0.02-0.35, Median: 0.185} {Count: 2, Range: 0.85-0.86, Median: 0.855} 
6   6 {Count: 5, Range: 0.01-0.39, Median: 0.37} {Count: 5, Range: 0.8-0.84, Median: 0.82} 
7   7 {Count: 5, Range: 0.4-0.44, Median: 0.42} {Count: 5, Range: 0.75-0.79, Median: 0.77} 
8   8 {Count: 5, Range: 0.45-0.49, Median: 0.47} {Count: 5, Range: 0.7-0.74, Median: 0.72} 
9   9  {Count: 1, Range: 0.5-0.5, Median: 0.5} {Count: 9, Range: 0.51-0.69, Median: 0.65} 
10  10            {Count: 10, Range: 0.55-0.64, Median: 0.595} 

melt ist hier eigentlich nicht notwendig. Sie könnten zu dem folgenden, wo die zusätzliche Zeile am Ende ist, mehr erklärende Namen zu erhalten.

sm = d %>% group_by(`Y decile`=ntile(Y,10), X.decile=ntile(X,2)) %>% 
    summarise(`X decile` = paste0("{N: ", n(), ", Range: ", min(X),"-",max(X),", Median: ",median(X),"}")) %>% 
    dcast(`Y decile` ~ X.decile, value.var="X decile", fill="", value.name=) %>% 
    setNames(., c(names(.)[1], paste0("X decile ", names(.)[-1]))) 
+0

Danke für den 'Umform'-Tipp! – Divi

Verwandte Themen