2012-10-23 15 views
5

Büyük bir veri çerçevesi alan ve her değer sütununu bu değerlerin birikimli sıklığına göre değiştiren bir program yazmaya çalışıyorum (artan sıralı). değerlerinin sütun bulunmaktadır Örneğin, 5, 8, 3, 5, 4, 3, 8, 5, 5, 1 O göreli ve kümülatif frekansları:Veri çerçevesini kümülatif frekansla etkin bir şekilde değiştirme

  • 1: rel_freq = 0.1, cum_freq = 0.1
  • 3: rel_freq = 0.2, cum_freq = 0.3
  • 4: rel_freq = 0.1, cum_freq = 0.4
  • 5: rel_freq = 0.4, cum_freq = 0.8
  • 8: rel_freq = 0.2, cum_freq =

Daha sonra orijinal Lumn: 0,8, 1,0, 0,3, 0,8, 0,4, 0,3, 1,0, 0,8, 0,8, 0,1

Aşağıdaki kod, bu işlemi doğru şekilde gerçekleştirir, ancak büyük olasılıkla iç içe geçmiş döngü nedeniyle yetersiz ölçeklenir. Bu görevi nasıl daha verimli gerçekleştirebileceğine dair bir fikriniz var mı?

mydata = read.table(.....) 

totalcols = ncol(mydata) 
totalrows = nrow(mydata) 

for (i in 1:totalcols) { 
    freqtable = data.frame(table(mydata[,i])/totalrows) # create freq table 
    freqtable$CumSum = cumsum(freqtable$Freq) # calc cumulative freq 

    hashtable = new.env(hash=TRUE) 
    nrows = nrow(freqtable) 

    # store cum freq in hash 
    for (x in 1:nrows) { 
     dummy = toString(freqtable$Var1[x]) 
     hashtable[[dummy]] = freqtable$CumSum[x] 
    } 

    # replace original data with cum freq 
    for (j in 1:totalrows) { 
     dummy = toString(mydata[j,i]) 
     mydata[j,i] = hashtable[[dummy]] 
    } 
} 
+0

Bize bir verebilir [tekrarlanabilir örnek] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-exa mple)? –

cevap

2

Bu for -loop olmadan tek bir sütun işler:

R> x <- c(5, 8, 3, 5, 4, 3, 8, 5, 5, 1) 
R> y <- cumsum(table(x)/length(x)) 
R> y[as.character(x)] 
    5 8 3 5 4 3 8 5 5 1 
0.8 1.0 0.3 0.8 0.4 0.3 1.0 0.8 0.8 0.1 
+0

Mükemmel cevap! Programım bu kodu kullanarak daha iyi ölçekler. Teşekkürler! – user1769120

1

İşte bir yoludur. Daha sonra,

  1. için basit bir işlevi table(x)/length(x) verilen oranlarda kullanılması cumsum() oluşturmak her biri için örnek verileri

    d <- data.frame(var1 = c(5, 8, 3, 5, 4, 3, 8, 5, 5, 1), 
           var2 = c(5, 8, 3, 5, 4, 3, 8, 5, 5, 1)) 
    

    kullanımı iki değişkenli

  2. match() bir gözlemler, bir veri çerçevesini kullanma kümülatif toplamlar tablosunun isimleri ile değişken, sonra
  3. kümülatif toplamları tablosundan seçmek için id eşleşmelerini kullanın (ve un-isim)

Böyle bir işlevleri:

bir veri çerçevesine lapply() kullanıp zorlamak Uygulamada
f <- function(x) { 
    tab <- cumsum(table(x)/length(x)) 
    ind <- match(x, as.numeric(names(tab))) 
    unname(tab[ind]) 
} 

:

out <- data.frame(lapply(d, f)) 
out 

verir:

R> out 
    var1 var2 
1 0.8 0.8 
2 1.0 1.0 
3 0.3 0.3 
4 0.8 0.8 
5 0.4 0.4 
6 0.3 0.3 
7 1.0 1.0 
8 0.8 0.8 
9 0.8 0.8 
10 0.1 0.1 
+0

Teşekkürler, bunu deneyeceğim. – user1769120

İlgili konular