2016-09-30 7 views
0

zu ändern Ich habe einige Ausreißer in meinem Dataset. Die interessierenden Variablen werden j_q3_1, j_q3_2,...,j_q3_14 und auch j_q4_1, j_q4_2,...,j_q4_14 genannt. Ich möchte Einträge, die größer als 95 Prozent sind, auf 95 Prozent ändern. Ich habe mich gefragt, ob ich eine Schleife erstellen könnte, die Frage Nummer ändert (q3 bis q4) und auch die letzte Nummer nach Unterstrich (1 bis 14). Irgendwelche Vorschläge werden sehr geschätzt.Schleife, um Ausreißer mehrerer Variablen zu 95% in R

Beispiel Daten (nur nur bis _2 und 3. und 4. Quartal):

test <- data.frame(hhid = c(1:5), j_q3_1 =c(1000,1500,2000,5000,10000), j_q4_1=c(500,100,200,10000,200), j_q5_1 =c(200,300,400,203,100), j_q3_2 =c(300,10000,200,300,200), j_q4_2=c(100,200,320,120,302), j_q5_2=c(10000,120,1222,300,2333)) 

Dieser Code für mich für jede Variable funktioniert:

quantiles <- quantile(test$j_q3_1,c(0.95)) 
    test$j_q3_1[test$j_q3_1 > quantiles[1]] <- quantiles[1] 

    quantiles <- quantile(test$j_q4_1,c(0.95)) 
    test$j_q4_1[test$j_q4_1 > quantiles[1]] <- quantiles[1] 

    quantiles <- quantile(test$j_q3_2,c(0.95)) 
    test$j_q3_2[test$j_q3_2 > quantiles[1]] <- quantiles[1] 

    quantiles <- quantile(test$j_q4_2,c(0.95)) 
    test$j_q4_2[test$j_q3_2 > quantiles[1]] <- quantiles[1] 

Jetzt habe ich versucht, den Code zu verwenden, zu meinem gesamten Datensatz und änderte die Bedingung in das 99% -Konfidenzintervall. Es funktioniert nicht so, wie es sein sollte, da der Ausreißer von 25000 derselbe bleibt, wenn die 99% der Variablen 9260 sind. Er änderte den Mittelwert von 1606 auf 1813 und senkte die NA von 2825 auf 2801 Beobachtungen.

for (i in 3:6){ 
    for (j in 1:14){ 
    cname <- paste0("j_q", i, "_", j) 
    quantiles <- quantile(test[, cname], c(0.99), na.rm = TRUE) 
    test[test[!is.na(test[, cname]), cname] > quantiles[1], cname] <- quantiles[1] 
    } 
} 
+0

Geben Sie gleiche Datenmenge und der erwarteten Ausgang, so dass wir auf der gleichen –

+0

Dank arbeiten. Ich fügte einen Beispieldatensatz hinzu, den ich verwende, um die Schleife auch heraus zu bilden. – imprela

Antwort

0

Sie können es wie folgt tun:

cname <- paste0("j_q", i, "_", j) 
quantiles <- quantile(test[, cname], c(0.99)) 
test[test[, cname] > quantiles[1], cname] <- quantiles[1] 

Wenn Sie NA-Werte haben:

cname <- paste0("j_q", i, "_", j) 
quantiles <- quantile(test[, cname], c(0.99), na.rm = TRUE) 
test[!is.na(test[,cname]) & test[, cname] > quantiles[1], cname] <- quantiles[1] 
+0

Vielen Dank! Dieser Code ist genau das, wonach ich gesucht habe! Es gibt jedoch einige NA in meinem Dataset, wie würde ich es in den Code einbauen? Ich habe versucht, Quantile <- Quantil (test [, cname], c (0.95), na.rm = TRUE) aber es würde nicht funktionieren und gibt mir diesen Fehler: Fehler in '[<-. Data.frame' (' * tmp * ', test [, cname]> Quantile [1], cname,: fehlende Werte sind in subskribierten Zuordnungen von Datenrahmen nicht erlaubt – imprela

+0

Das kommt von den na-Werten in test [, cname]. Wollen Sie na zu Bleiben Sie in Ihrem final data.frame na ... – user1470500

+0

Ja, ich möchte, dass NA im Datenrahmen bleibt – imprela

0

Dies ist ein guter Kandidat für die funktionale Programmierung sein kann:

quantOut <- function(vec) { 
    quantiles <- quantile(vec,c(0.95)) 
    vec[vec > quantiles[1]] <- quantiles[1] 
    return(vec) 
} 

Jetzt quantOut wickelt die pr Sie haben den Vorgang für eine bestimmte Spalte abgeschlossen. Es kann in jedem notwendigen Kontext verwendet werden.

test %>% mutate_at(vars(j_q3_1:j_q4_14), quantOut) 
0
fn_FindUpperLimit = function(x) quantile(x,0.95) 
fn_ReplaceUpperExtreme = function(x) ifelse(x>quantile(x,0.95),quantile(x,0.95),x) 

mtcars %>% 
select(disp,hp,drat,wt,qsec) %>% 
mutate_each(funs(fn_FindUpperLimit),everything()) %>% 
distinct() 
# disp  hp drat  wt qsec 
#1 449 253.55 4.3145 5.29275 20.1045 

mtcars %>% 
select(disp,hp,drat,wt,qsec) %>% 
mutate_each(funs(fn_ReplaceUpperExtreme),everything()) 


# disp  hp drat  wt qsec 
#1 160.0 110.00 3.9000 2.62000 16.4600 
#2 160.0 110.00 3.9000 2.87500 17.0200 
#3 108.0 93.00 3.8500 2.32000 18.6100 
#4 258.0 110.00 3.0800 3.21500 19.4400 
#5 360.0 175.00 3.1500 3.44000 17.0200 
#6 225.0 105.00 2.7600 3.46000 20.1045 
#7 360.0 245.00 3.2100 3.57000 15.8400 
#8 146.7 62.00 3.6900 3.19000 20.0000 
#9 140.8 95.00 3.9200 3.15000 20.1045 
#10 167.6 123.00 3.9200 3.44000 18.3000 
#11 167.6 123.00 3.9200 3.44000 18.9000 
#12 275.8 180.00 3.0700 4.07000 17.4000 
#13 275.8 180.00 3.0700 3.73000 17.6000 
#14 275.8 180.00 3.0700 3.78000 18.0000 
#15 449.0 205.00 2.9300 5.25000 17.9800 
#16 449.0 215.00 3.0000 5.29275 17.8200 
#17 440.0 230.00 3.2300 5.29275 17.4200 
#18 78.7 66.00 4.0800 2.20000 19.4700 
#19 75.7 52.00 4.3145 1.61500 18.5200 
#20 71.1 65.00 4.2200 1.83500 19.9000 
#21 120.1 97.00 3.7000 2.46500 20.0100 
#22 318.0 150.00 2.7600 3.52000 16.8700 
#23 304.0 150.00 3.1500 3.43500 17.3000 
#24 350.0 245.00 3.7300 3.84000 15.4100 
#25 400.0 175.00 3.0800 3.84500 17.0500 
#26 79.0 66.00 4.0800 1.93500 18.9000 
#27 120.3 91.00 4.3145 2.14000 16.7000 
#28 95.1 113.00 3.7700 1.51300 16.9000 
#29 351.0 253.55 4.2200 3.17000 14.5000 
#30 145.0 175.00 3.6200 2.77000 15.5000 
#31 301.0 253.55 3.5400 3.57000 14.6000 
#32 121.0 109.00 4.1100 2.78000 18.6000 
0

einfach mit Sockel R

quantile <- quantile(test$j_q3_1,0.95) 
test[test>=10000] <- quantile 

hhid j_q3_1 j_q4_1 j_q5_1 j_q3_2 j_q4_2 j_q5_2 
1 1 1000 500 200 300 100 9000 
2 2 1500 100 300 9000 200 120 
3 3 2000 200 400 200 320 1222 
4 4 5000 9000 203 300 120 300 
5 5 9000 200 100 200 302 2333 
Verwandte Themen