2017-05-10 14 views
0

Meine Daten sieht in etwa so aus, was ich jetzt tun möchte, ist eine neue Spalte erstellen "Mean", wo ich den Mittelwert von " Kunden akzeptiert "für alle die gleichen Werte in der Spalte" Preis ".Erstellen einer neuen Variablen, die den Mittelwert der gleichen Werte eines vorhandenen Variablen in R

Product | Price | Customer Accepted 
     A  17.2   1 
     A  16.8   0 
     A  17.2   1 
     B  21   1 
     B  16.8   0 
     A  21   0 
     C  17.2   0 

Zum Beispiel, 17,2 repeats 3 mal, und der Mittelwert der entsprechenden Kunden akzeptierten Werte (1 + 1 + 0/3 = 0,66); ähnlich für 16.8 ist es (0 + 0/2 = 0), für 21 ist es (1 + 0/2 = 0.50); Die neue Spalte "Mean" sollte diese Werte haben, wenn sich der gleiche Preis wiederholt.

Meine erwartete Ausgabe

Product | Price | Customer Accepted | Mean 
     A  17.2   1   0.66 
     A  16.8   0    0 
     A  17.2   1   0.66 
     B  21   1   0.50 
     B  16.8   0    0 
     A  21   0   0.50 
     C  17.2   0   0.66 

Es gibt rund 950 verschiedene Ebenen für den Preis Wert ist, und die Anzahl der Male ist jeder Wert Wiederholungen nicht konsistent. Kann mir jemand dabei helfen? Vielen Dank

Antwort

0

Ich hoffe, ich habe Sie richtig verstanden und unten ist der Code, der verwendet werden kann, um das Gleiche zu tun.

df <- data.frame(Product = c("A","A","A","B","B","A","C"),Price = c(17.2,16.8,17.2,21,16.8,21,17.2),Accpeted = c(1,0,1,1,0,0,0)) 

df$mean <- ave(df$Accpeted,df$Price,FUN=mean) 

Ich habe all Funktion von Basis R.

Ausgang verwendet:

Product Price Accpeted  mean 
1  A 17.2  1 0.6666667 
2  A 16.8  0 0.0000000 
3  A 17.2  1 0.6666667 
4  B 21.0  1 0.5000000 
5  B 16.8  0 0.0000000 
6  A 21.0  0 0.5000000 
7  C 17.2  0 0.6666667 
+0

vielen Dank Kumpel verwenden, dies half :) – David

+0

@ David Wenn dies half Ihnen dann vergessen Sie nicht, die Antwort zu akzeptieren. http://stackoverflow.com/help/someone-answers, Danke – PKumar

0

Es gibt etwas namens Gruppierung in den meisten großen Datenanalyse-Pakete, wie zum Beispiel das data.table Paket. Das könntest du dir natürlich ansehen. Aber etwas Vanille R Möglichkeit wäre das hier: Dies ist jedoch aus Gründen der Lesbarkeit nicht optimal. (Werte neu berechnet werden, obwohl sie im Cache gespeichert werden können.)

a = data.frame(
    product = c("A", "A", "A", "B", "B", "A", "C"), 
    price = c(17.2, 16.8, 17.2, 21, 16.8, 21, 17.2), 
    accepted = c(1, 0, 1, 1, 0, 0) 
) 

invisible(
    lapply(1:nrow(a), function(i) { 
    a[i, "mean"] <<- mean(a[a$price == a[i, "price"], "accepted"]) 
    }) 
) 

Dies tut buchstäblich, was Sie vorhatten: Iterieren durch jede Zeile, weisen Sie einen neuen Wert der data.frame, dass der Mittelwert aller akzeptierten -Werte, bei denen der Preis derselbe ist wie in dieser Zeile.

0

Der dplyr Ansatz würde wie folgt aussehen.

library(dplyr) 
df <- data.frame(Product = c("A","A","A","B","B","A","C"), Price = c(17.2,16.8,17.2,21,16.8,21,17.2), CustomerAccepted=c(1,0,1,1,0,0,0)) 

df.summ <- 
    df %>% 
    group_by(Price) %>% 
    summarise(Mean = mean(CustomerAccepted)) 
1

Wir data.table

library(data.table) 
setDT(df)[, Mean := mean(Accpeted), Price] 
Verwandte Themen