2016-11-24 9 views
1

I-Daten haben wie so:mehrere Spalten mit Spalten Mittelwert von Nicht-Null-Werte ersetzen

aye <- c(0,0,3,4,5,6) 
bee <- c(3,4,0,0,7,8) 
see <- c(9,8,3,5,0,0) 
df <- data.frame(aye, bee, see) 

ich für eine prägnante Art und Weise suchen Spalten für jede der Spalten in dem Datenrahmen basierend auf dem Mittelwert zu erstellen , wobei Null bei Null gehalten wird.

df2 <- as.data.frame(t(apply(df, 2, function(x) mean(x[x>0])))) 

Ich kann nicht herausfinden, wie einfach die Werte in der Spalte mit der Mittelwert ohne Null ersetzen:

Um den Mittelwert ohne Null zu erhalten. Mein Ansatz ist so weit:

df$aye <- ifelse(df$aye == 0, 0, df2$aye) 
df$bee <- ifelse(df$bee == 0, 0, df2$bee) 
df$see <- ifelse(df$see == 0, 0, df2$see) 

Aber das wird chaotisch mit vielen Variablen - wäre schön, es in einer Funktion zu wickeln.

Danke für Ihre Hilfe!

Antwort

2

Warum nicht können wir

data.frame(lapply(dat, function (u) ave(u, u > 0, FUN = mean))) 

# aye bee see 
#1 0.0 5.5 6.25 
#2 0.0 5.5 6.25 
#3 4.5 0.0 6.25 
#4 4.5 0.0 6.25 
#5 4.5 5.5 0.00 
#6 4.5 5.5 0.00 

Hinweis verwenden nur, habe ich dat statt df als den Namen Ihres Datenrahmens. df ist eine Funktion in R und maskiert sie nicht.

+0

Prägnant und auf den Punkt. Mach weiter so! – akrun

+0

Oder eine andere Option ist 'lapply (df, function (u) (!! u) * mean (u [u> 0]))' – akrun

+0

Ja, es ist eine doppelte Negation, erste Negation gibt 0 Werte TRUE, also wieder negieren um es FALSCH zu machen, aber ich schätze deine Version ist viel besser – akrun

1

Wir können das Ergebnis der Anwendungsfunktion als numerischen Vektor in x behalten.

x <- apply(df, 2, function(x){ mean(x[x>0])}) 
df[which(df!=0, arr.ind = T)] <- x[ceiling(which(df!=0)/nrow(df))] 

df 
# aye bee see 
#1 0.0 5.5 6.25 
#2 0.0 5.5 6.25 
#3 4.5 0.0 6.25 
#4 4.5 0.0 6.25 
#5 4.5 5.5 0.00 
#6 4.5 5.5 0.00 

den Code Breaking down weiter die Arbeits

Gibt die Indizes zu erklären, wo der Wert dieser Zeile entscheidet nicht Null

which(df! = 0) 
#[1] 3 4 5 6 7 8 11 12 13 14 15 16 

ist, welcher Index wir wählen gehen, um von x

ceiling(which(df!=0)/nrow(df)) 
#[1] 1 1 1 1 2 2 2 2 3 3 3 3 

x[ceiling(which(df!=0)/nrow(df))] 
#aye aye aye aye bee bee bee bee see see see see 
#4.50 4.50 4.50 4.50 5.50 5.50 5.50 5.50 6.25 6.25 6.25 6.25 

Jetzt ersetzen die obigen Werte wo Wert i sn't gleich 0 in dem Datenrahmen

df[which(df!=0, arr.ind = T)] <- x[ceiling(which(df!=0)/nrow(df))] 
1

Versuche neu anordnen, was Sie bereits in eine zeroless_mean Funktion haben, und dann apply Ihre data.frame auf jeder Spalte verwenden:

# Data 
aye <- c(0,0,3,4,5,6) 
bee <- c(3,4,0,0,7,8) 
see <- c(9,8,3,5,0,0) 
dff <- data.frame(aye, bee, see) 

# Function 
zeroless_mean <- function(x) ifelse(x==0,0,mean(x[x!=0])) 

# apply 
data.frame(apply(dff, 2, zeroless_mean)) 

# Output 

    aye bee see 
1 0.0 5.5 6.25 
2 0.0 5.5 6.25 
3 4.5 0.0 6.25 
4 4.5 0.0 6.25 
5 4.5 5.5 0.00 
6 4.5 5.5 0.00 

ich diese Hoffnung hilft.

Verwandte Themen