2011-08-13 28 views
5

Làm cách nào để chọn n số tập con từ một khung dữ liệu bằng cách lấy mọi hàng thứ một cho tập con 1 rồi đến hàng thứ n cho tập hợp con 2 rồi nth + 3 cho subset3 đến thứ n = nChọn một số tập con bằng cách lấy các khoảng thời gian khác nhau và chức năng ứng dụng cho tất cả các tập hợp con

tôi đã sử dụng

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

Nhưng điều này mang lại một tập hợp con sau đó tôi phải tiếp tục thay đổi thứ n từ 1 ... n để có được khác nhau subsets.eg sử dụng một dữ liệu nhỏ (106 hàng x 742 cột) được đặt để nhận 10 tập hợp con của mỗi hàng thứ 10

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

Có cách nào để làm điều này tốt hơn không?

Từ trải qua FAQ Tôi đã thử sử dụng vòng như

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) 

này trả về danh sách 3 dữ liệu chỉ với những biến cuối cùng trong khung dữ liệu, tôi không chắc chắn nơi tôi đã đi sai, còn làm thế nào tôi có thể chỉ nhận được tên của các tập hợp con thay vì một khung dữ liệu như tôi muốn áp dụng một hàm PLS hiệu chuẩn để các tập con tạo

Xin hãy tha thứ và sửa chữa bất kỳ sai lầm kể từ bây giờ tôi đang học lập trình và R.

Trả lời

2

tôi gợi ý Bạn lưu trữ tất cả các tập con khác nhau thành một đối tượng list. Tôi không chắc tôi 100% đã làm theo mã của bạn ở trên, nhưng tôi nghĩ rằng điều này sẽ làm những gì bạn muốn:

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) 
} 

Điều gì đang xảy ra?

  1. Đầu tiên chúng ta preallocate một đối tượng danh sách tương ứng với số lượng các tập con bạn muốn chắc
  2. Xác định tổng số hàng, do đó bạn không cần phải vượt qua nó như một tham số cho hàm
  3. Sử dụng vòng lặp for tương tự với những gì bạn đã sử dụng để xác định những hàng cần lấy, và sau đó xác định những hàng được xác định ở trên
  4. Trả về đối tượng danh sách.

Đây là ví dụ sử dụng dữ liệu mtcars. Lưu ý số liệu chỉ có 32 dòng, do đó chức năng tự động xử lý các kí hiệu đó là ngoài giới hạn và không ném một cảnh báo/báo lỗi:

FOO (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

Cảm ơn bạn rất nhiều công trình và cảm ơn bạn đã giải thích rằng tôi đã có thể theo dõi dễ dàng. – DinoSingh

3

Một một lót bằng cách sử dụng lapply mượn ý tưởng chức năng từ @Chase.

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

foo2(mtcars, 5, 15) 
+0

Cảm ơn bạn rất nhiều vì mã ngắn hơn. – DinoSingh

+0

Điều này tương tự như những gì tôi muốn làm ... chọn mỗi dòng 12 của một tập dữ liệu rất lớn. Khi tôi chạy hàm và mã, đầu ra trong giao diện điều khiển có vẻ đúng, sau đó khi tôi gọi nó là tên datafame mới (ví dụ: df2 <- foo2 (mtcars, 1, 15) trong ví dụ của bạn, tôi chỉ nhận được một điều rất lạ ' Làm thế nào tôi có thể khắc phục điều này? Rất cám ơn @Ramnath –

Các vấn đề liên quan