2011-08-13 7 views
5

Alt satır 2 için nth +1 satırı, sonra nth + 3 için her row satırı alt kümesi 1 alarak bir veri çerçevesinden n alt kümesini n sayısını nasıl seçebilirim subset3 için o zaman 1'den n'inci değişen tutmak için ... n (küçük bir veri kullanarak farklı subsets.eg almak zorunda ben Tüm alt kümelere farklı satır aralığı ve tam işlev ekleyerek birkaç altkümeyi seçin

subset<-data[seq(nth,length,n),] 

kullanmış Ama bu bir alt kümesini verir

= n'inci kadar n

106 satır x 742 sütun), her 10uncu satırın 10 alt kümesini almak üzere ayarlanmış

subset1<-data[seq(1,106,10),] 
subset2<-data[seq(2,106,10),] 
subset3<-data[seq(3,106,10),] 

Bunu daha iyi yapmanın bir yolu var mı? Nerede yanlış

SSS geçiyor itibaren ben Bu veriler çerçevesinde sadece son değişkenle 3 veri listesini döndürür

sub<-function(data,nth,length,n){ 
     sub<-data[seq(nth,length,n),] 
     for(n in 1:(sub)){ 
     sub2<-sub[nth,]+1,sub3<-sub[nth,]+2,sub4<-sub[nth,]+3) } 
     su<-(sub,sub2, sub3,sub4) 
    return(su) 
    } 
sub(data=gag11p,n=1,length=106,10) 

gibi döngüler kullanarak denedi, ben de nasıl can, emin değilim sadece alt kümeleri için bir PLS kalibrasyon fonksiyonunu uygulamak istediğiniz kadar yerine bir veri çerçevesinin alt kümesini adını almak

bağışla ve ben şimdi

cevap

2

Ben programlama ve R. öğreniyorum beri herhangi bir hata düzeltin yarattı sugges Bu farklı alt kümelerin tümünü tek bir list nesnesine depolarsınız. Yukarıdaki kodunuzu% 100 izlediğime emin değilim, ama bence istediğini yapıyor:

FOO <- function(data, nSubsets, nSkip){ 
    outList <- vector("list", length = nSubsets) 
    totRow <- nrow(data) 

    for (i in seq_len(nSubsets)) { 
    rowsToGrab <- seq(i, totRow, nSkip) 
    outList[[i]] <- data[rowsToGrab ,] 
    } 
    return(outList) 
} 

Neler oluyor?

  1. Biz ilk önce işleve bir parametre olarak geçmek zorunda kalmamak
  2. toplam satır sayısını tanımlayın yapmak istiyorum alt kümeleri sayısına karşılık gelir bir liste nesnesi preallocate
  3. Hangi satırların yakalanacağını belirlemek için kullandığınız for döngüsüne benzer bir döngü kullanın ve sonra bunu yukarıda tanımlanan listeye tanımlayın
  4. Liste nesnesini döndürün.

İşte mtcars verileri kullanılarak bir örnek.

FAN (mtcars, 5, 15)

[[1]] 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 #row 1 
Lincoln Continental 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4 #row 16 
Maserati Bora  15.0 8 301 335 3.54 3.570 14.60 0 1 5 8 #row 31 

[[2]] 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 #row 2 
Chrysler Imperial 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4 #row 17 
Volvo 142E  21.4 4 121 109 4.11 2.780 18.60 1 1 4 2 #row 32 

[[3]] 
      mpg cyl disp hp drat wt qsec vs am gear carb 
Datsun 710 22.8 4 108.0 93 3.85 2.32 18.61 1 1 4 1 #row 3 
Fiat 128 32.4 4 78.7 66 4.08 2.20 19.47 1 1 4 1 #row 18 

[[4]] 
       mpg cyl disp hp drat wt qsec vs am gear carb 
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 #row 4 
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 #row 19 

[[5]] 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 #row 5 
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 #row 20 
+0

Çok çalıştığınız için teşekkür ederim ve kolayca takip edebildiğim açıklama için teşekkür ederim. – DinoSingh

3

bir on: fonksiyonu otomatik olarak sınırların dışında olan alt simgeler kolları ve bir uyarı/hata atmak değildir bu yüzden, veri kümesi, yalnızca 32 sıraya sahiptir Not lapply kullanarak liner, @Chase'den fonksiyon fikrini ödünç alıyor.

foo2 = function(data, nSubsets, nSkip){ 
    lapply(1:nSubsets, function(n) data[seq(n, NROW(data), by = nSkip),]) 
} 

foo2(mtcars, 5, 15) 
+0

Kısa kod için çok teşekkür ederim. – DinoSingh

+0

Bu, yapmak istediğim şeye benziyor ... çok büyük bir veri kümesinin her 12 satırını seçiyor. İşlev ve kodu çalıştırdığımda, konsoldaki çıktı doğru görünüyor, sonra buna yeni bir veri ismi (örnekte df2 <- foo2 (mtcars, 1, 15)) adını verdiğimde, çok garip bir uzun sürüyorum. 'Bunu nasıl giderebilirim? Çok teşekkürler @Ramnath –

İlgili konular