2012-09-13 61 views
5

Tôi là người dùng mới cho R và cho vòng lặp. Tôi đang cố gắng lấy mẫu từ dữ liệu và kiểm tra xem có cột colinear không. Tôi muốn ghi lại trong đó lặp đi lặp lại rằng cột colinear tồn tại và ghi lại nó trong vector (baditr). Ngoài ra, tôi muốn in một dòng cho biết rằng "colinearity là tại i iteration". Sau đó, tôi muốn mã nhảy tới lần lặp thứ hai và tiếp tục chạy. Đối với mỗi lần lặp, tôi muốn mã lưu tổng của các cột trong hàng tương ứng của ma trận.Chọn các hàng không có giá trị bị thiếu trong R

Vấn đề của tôi là tôi nhận được NA cho các lần lặp lại không tốt. Ý định của tôi là để lặp lại xấu không được bao gồm trong ma trận của tôi cả. Đây là mã của tôi:

a0=rep(1,40) 
a=rep(0:1,20) 
b=c(rep(1,20),rep(0,20)) 
c0=c(rep(0,12),rep(1,28)) 
c1=c(rep(1,5),rep(0,35)) 
c2=c(rep(1,8),rep(0,32)) 
c3=c(rep(1,23),rep(0,17)) 
da=matrix(cbind(a0,a,b,c0,c1,c2,c3),nrow=40,ncol=7) 
sing <- function(nrw){ 
    sm <- matrix(NA,nrow=nrw,ncol=ncol(da)) 
    baditr <- NULL 
    for(i in 1:nrw){ 
    ind <- sample(1:nrow(da), nrow(da),replace =TRUE) 
    smdat <- da[ind,] 
    evals <- eigen(crossprod(smdat))$values 
    if(any(abs(evals) < 1e-7)){ 
     baditr <- c(baditr,i) 
     cat("singularity occurs at", paste(i),"\n") 
     next 
    } 
    sm[i,] <- apply(smdat,2,sum) 
    } 
    return(sm) 
} 
sing(20) 

tôi sẽ nhận được kết quả như sau:

singularity occurs at 9 
singularity occurs at 13 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
[1,] 40 23 22 25 5 8 26 
[2,] 40 20 18 30 4 7 22 
[3,] 40 19 24 28 6 7 25 
[4,] 40 19 22 30 6 9 26 
[5,] 40 12 26 26 8 13 30 
[6,] 40 17 16 27 7 10 19 
[7,] 40 20 17 33 3 5 19 
[8,] 40 22 19 28 4 9 23 
[9,] NA NA NA NA NA NA NA 
[10,] 40 21 24 28 3 6 27 
[11,] 40 21 16 31 2 4 22 
[12,] 40 21 21 26 3 6 23 
[13,] NA NA NA NA NA NA NA 
[14,] 40 18 16 29 2 7 22 
[15,] 40 24 18 30 6 9 21 
[16,] 40 23 18 29 4 8 21 
[17,] 40 17 25 25 3 8 29 
[18,] 40 22 28 23 9 14 30 
[19,] 40 25 23 25 7 11 30 
[20,] 40 20 23 27 7 10 26 

Tôi muốn ma trận của tôi trông như thế này:

singularity occurs at 9 
singularity occurs at 13 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
[1,] 40 23 22 25 5 8 26 
[2,] 40 20 18 30 4 7 22 
[3,] 40 19 24 28 6 7 25 
[4,] 40 19 22 30 6 9 26 
[5,] 40 12 26 26 8 13 30 
[6,] 40 17 16 27 7 10 19 
[7,] 40 20 17 33 3 5 19 
[8,] 40 22 19 28 4 9 23 
[10,] 40 21 24 28 3 6 27 
[11,] 40 21 16 31 2 4 22 
[12,] 40 21 21 26 3 6 23 
[14,] 40 18 16 29 2 7 22 
[15,] 40 24 18 30 6 9 21 
[16,] 40 23 18 29 4 8 21 
[17,] 40 17 25 25 3 8 29 
[18,] 40 22 28 23 9 14 30 
[19,] 40 25 23 25 7 11 30 
[20,] 40 20 23 27 7 10 26 

Như một không an toàn, tôi sẽ cũng đánh giá cao bất kỳ thông tin nào bạn có thể có về lưu một số lần lặp nhất định vào một tệp (ví dụ: 50 lần lặp), mà tôi có thể ghi đè khi số lần lặp tiếp theo được tạo. Có nghĩa là, tôi lưu 50 lần lặp đầu tiên vào một tệp và sau đó khi vòng lặp thứ hai của 50 lần lặp được tạo, chúng ghi đè vòng đầu tiên và kết quả là tệp của tôi hiện có 100 lần lặp.

Xin lỗi vì bài đăng dài. Nhưng cảm ơn trước.

+0

Nếu không nhìn vào các cơ chế chức năng, nếu bạn muốn trả về 'sm' không có' NA' giá trị, sau đó 'return (na.omit (sm))' sẽ làm thủ thuật – mnel

+0

@mnel cảm ơn bạn Tôi quên mất lệnh này. bởi vì vấn đề chính của tôi là với lệnh tiếp theo trên mã ban đầu của tôi, tôi kiểm tra nếu có một collinearity trong dữ liệu để phù hợp hay không một mô hình, "do đó, điều kiện tôi áp đặt là nếu có collinearity cho tôi biết tại những gì iteration và không phù hợp với mô hình sau đó bắt đầu lặp lại tiếp theo ". cũng là vấn đề với việc lưu tập tin tại một số lần lặp nhất định. –

Trả lời

6

Trước khi bạn trả lại sm, bạn có thể lọc ra các hàng có giá trị NA bằng cách sử dụng complete.cases(). Nó sẽ trông giống như sm[complete.cases(sm),]. Hàm trả về một vectơ lô-gic của các giá trị TRUE/FALSE, buộc R không trả về các giá trị đó bằng FALSE. Ngoài ra, nó không giống như bạn đang làm bất cứ điều gì với baditers sau khi xác định nó.Tôi có thể nhận xét ra tất cả các dòng đề cập đến baditers và chức năng của bạn dường như làm việc tốt ... có thể đó là một di sản từ một phiên bản cũ hơn mã của bạn?

Cập nhật

Đây là chức năng được cập nhật của bạn bằng cách sử dụng complete.cases(). Lưu ý Tôi cũng đã nhận xét mọi thứ có liên quan đến baditr để minh họa rằng nó hiện không làm bất kỳ điều gì trong mã của bạn.

sing <- function(nrw){ 
    sm <- matrix(NA,nrow=nrw,ncol=ncol(da)) 
    #baditr <- NULL 
    for(i in 1:nrw){ 
    ind <- sample(1:nrow(da), nrow(da),replace =TRUE) 
    smdat <- da[ind,] 
    evals <- eigen(crossprod(smdat))$values 
    if(any(abs(evals) < 1e-7)){ 
     #baditr <- c(baditr,i) 
     cat("singularity occurs at", paste(i),"\n") 
     next 
    } 
    sm[i,] <- apply(smdat,2,sum) 
    } 
    return(sm[complete.cases(sm),]) 
} 

Bây giờ chúng ta hãy chạy chức năng, tôi gói dim() quanh cuộc gọi chức năng này sẽ cho chúng tôi biết #rows và #columns của đối tượng kết quả:

> dim(sing(20)) 
singularity occurs at 6 
[1] 19 7 

Vì vậy, một điểm kỳ dị và một ma trận 19 hàng và 7 cột, tôi có thiếu gì không?

Đối với câu hỏi khác của bạn về cách viết ra, bạn có biết thông số append thành write.table() và bạn bè không?Các trang trợ giúp cho chúng ta biết If TRUE, the output is appended to the file. If FALSE, any existing file of the name is destroyed.

Cập nhật 2

Dưới đây là một ví dụ sử dụng append = TRUE trong write.table()

#Matrix 1 definition and write to file 
x <- matrix(1:9, ncol = 3) 
write.table(x, "out.txt", sep = "\t", col.names = TRUE, row.names = FALSE) 
#Matrix 2 definition and write to same file with append = TRUE 
x2 <- matrix(10:18, ncol = 3) 
write.table(x2, "out.txt", sep = "\t", col.names = FALSE, row.names = FALSE, append = TRUE) 
#read consolidated data back in to check if it's right 
x3 <- read.table("out.txt", header = TRUE) 

Kết quả trong

V1 V2 V3 
1 1 4 7 
2 2 5 8 
3 3 6 9 
4 10 13 16 
5 11 14 17 
6 12 15 18 
+0

Tôi đã thử phương pháp của bạn nhưng nó không hoạt động bất kỳ đề xuất nào khác. những gì về việc tiết kiệm vào tập tin tại số lượng nhất định của iteration –

+0

@frespider - thêm chức năng sửa đổi của bạn có thể trông như thế nào, tôi thiếu cái gì? – Chase

+0

Bạn có thể giải thích thêm về write.table và thêm –

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