2017-05-26 11 views
0

Hallo ich habe eine Spalte in einem Datenrahmen in R 0 in einer Spalte neu zu kodieren, die von 0 bestehtWie kommt man zum Median der Spalte

Sample - 
mdfam0 
25870 
28670 
21345 
85100 
0 

Es liegt direkt schief, und ich möchte es mit der ersetzt werden Medianwert der Spalte.

Ich lerne Datenreinigung mit R. Jede Hilfe wäre großartig.

Antwort

1

Mit data.table:

library(data.table) 
setDT(Sample) 

Sample[ , mdfam0 := { 
    V = mdfam0 
    idx = V == 0 
    med = median(V[!idx]) 
    V[idx] = med 
    V 
}] 

Oder vielleicht

Sample[mdfam0 == 0, mdfam0 := Sample[mdfam0 > 0, median(mdfam0)] ] 
2

So haben Sie eine data.frame:

x=data.frame("mdfam0"=c(25870,28670,21345,85100,0)) 
> x 
    mdfam0 
1 25870 
2 28670 
3 21345 
4 85100 
5  0 

Wenn Sie die 0er alle wollen den Median der sein ganze Spalte, verwenden Sie

> x$mdfam0[x$mdfam0==0]=median(x$mdfam0) #wherever x$mdfam0 is 0, change that value to the median of x$mdfam0 
> x 
    mdfam0 
1 25870 
2 28670 
3 21345 
4 85100 
5 25870 

Wenn stattdessen wollen Sie alle 0s der Median aller Zahlen größer als 0 ist, verwenden

> x$mdfam0[x$mdfam0==0]=median(x$mdfam0[x$mdfam0>0]) #wherever x$mdfam0 is 0, change that value to the median of all numbers greater than 0 
> x 
    mdfam0 
1 25870 
2 28670 
3 21345 
4 85100 
5 27270 
+0

Anbetracht ist ** wichtig, da der Median, wie viele Elemente abhängt beteiligt sein. BTW: Ich habe genau die gleiche Antwort geschrieben. –

+0

Danke @matt. Die Spalte, an der ich arbeite, ist jedoch eine Faktorvariable. Der Datensatz bezieht sich auf Chicago-Mietdaten. –

+0

Dann verwenden Sie einfach as.numeric (as.character (x $ mdfam0)) – Matt

0
Sample$mdfam0[Sample$mdfam0==0] = median(Sample$mdfam0[Sample$mdfam0!=0]) 

EDIT:

Die RHS: Stuff in den eckigen Klammern hilft, die Nicht-Null-Elemente der Spalte zu extrahieren. Die median Funktion wird aufgerufen, um den Median dieser Elemente zu berechnen.

Die LHS: Das Zeug in den eckigen Klammern hilft, die 0s in der Spalte zu isolieren.

Wenn Sie die Werte gleich setzen, werden die 0 durch den Median ersetzt.

+0

Können Sie einen Kommentar dazu abgeben, was dieser Code bewirkt? –

0

Eine Option ist na.aggregate von zoo zu verwenden und die 0er oder nicht enthalten ** angeben, ob die FUN als median

library(zoo) 
library(tidyverse) 
df1 %>% 
    mutate(Sample = na.aggregate(replace(Sample, Sample == 0, NA), FUN = median)) 
# Sample 
#1 mdfam0 
#2 25870 
#3 28670 
#4 21345 
#5 85100 
#6 28670 
0
Sample = data.frame("mdfam0" = c(25870, 28670, 21345, 85100, 0)) 
Sample %>% 
    dplyr::mutate(mdfam0 = ifelse(mdfam0 == 0, NA, mdfam0), 
       mdfam0 = ifelse(is.na(mdfam0), median(mdfam0, na.rm = TRUE), mdfam0)) 
Verwandte Themen