2010-03-30 55 views
24

Điều gì xảy ra nếu một người muốn apply một functon tức là mỗi hàng ma trận, nhưng cũng muốn sử dụng làm đối số cho hàm này số hàng đó. Ví dụ, giả sử bạn muốn lấy gốc thứ n của các số trong mỗi hàng của ma trận, trong đó n là số hàng. Có cách nào khác không (chỉ sử dụng apply) so với cột ràng buộc các số hàng với ma trận ban đầu, như thế này?Truy cập hàng/cột trong chức năng 'áp dụng'

test <- data.frame(x=c(26,21,20),y=c(34,29,28)) 

t(apply(cbind(as.numeric(rownames(test)),test),1,function(x) x[2:3]^(1/x[1]))) 

P.S. Trên thực tế nếu kiểm tra thực sự là một ma trận: test <- matrix(c(26,21,20,34,29,28),nrow=3), rownames (thử nghiệm) không giúp :( Cảm ơn bạn

+0

Lưu ý rằng trong ví dụ của bạn, bạn không cần áp dụng! –

+0

Có, tôi có thể thấy điều đó :) Thực ra tôi muốn vẽ một số dòng trên một ô tại các vị trí được liên kết với số dòng. – Brani

Trả lời

26

Những gì tôi thường làm là chạy sapply trên số hàng 1:nrow(test) thay vì test, và sử dụng test[i,]. bên trong hàm:.

t(sapply(1:nrow(test), function(i) test[i,]^(1/i))) 

tôi không chắc chắn điều này thực sự hiệu quả, mặc dù

+0

Nhược điểm duy nhất của điều này là nếu chức năng phức tạp, bạn không thể dễ dàng tái sử dụng nó với các khung dữ liệu khác nhau. Nhưng tôi đồng ý đi qua một vector của các vị trí và sau đó sử dụng nó để lập chỉ mục là con đường để đi. –

+0

Cẩn thận - nếu nrow (kiểm tra) == 0 thì điều này sẽ lặp lại từ 1 đến 0 và phép thử [i,] sẽ thất bại – PeterVermont

2

trên thực tế, trong trường hợp của một ma trận, bạn thậm chí không cần apply Chỉ cần:.

test^(1/row(test)) 

thực hiện những gì bạn muốn, tôi nghĩ vậy. Tôi nghĩ rằng các chức năng row() là điều bạn đang tìm kiếm.

+0

Tôi đồng ý, nhưng hãy xem các nhận xét bên dưới câu hỏi. – Brani

+1

Có, nhưng tôi vẫn nghĩ rằng hàm "row()" chính xác là những gì bạn cần. – darrenjw

+0

Tuy nhiên tôi không thể thấy làm thế nào tôi có thể cung cấp cho một lệnh 'dòng' như thế này ' dòng (kiểm tra [i,], c (i, i)) 'mà không có một vòng lặp áp dụng hoặc cho một. 'dòng (CI, hàng (CI))' không hoạt động – Brani

1

cbind() nhập số hàng có vẻ là một cách tiếp cận khá đơn giản. Đối với ma trận (hoặc khung dữ liệu), những điều sau đây sẽ hoạt động:

apply(cbind(1:(dim(test)[1]), test), 1, function(x) plot(x[-1], main=x[1])) 

hoặc bất kỳ thứ gì bạn muốn vẽ.

3

Nếu bạn đặt tên hàm thay vì đặt tên ẩn danh, bạn có thể chuyển đối số dễ dàng hơn. Chúng tôi có thể sử dụng nrow để nhận số hàng và chuyển một vectơ của các số hàng dưới dạng tham số, cùng với khung được lập chỉ mục theo cách này.

Để rõ ràng, tôi đã sử dụng một hàm mẫu khác; ví dụ này nhân cột x theo cột y cho ma trận 2 cột:

test <- data.frame(x=c(26,21,20),y=c(34,29,28)) 
myfun <- function(position, df) { 
    print(df[position,1] * df[position,2]) 
} 

positions <- 1:nrow(test) 
lapply(positions, myfun, test) 
0

Tôi hơi nhầm lẫn vì vậy xin lỗi nếu tôi hiểu sai nhưng bạn muốn tìm ra số thứ ba của các số trong mỗi hàng của một ma trận trong đó n = số hàng. Nếu đây này các trường hợp sau đó nó thực sự đơn giản tạo ra một mảng mới với kích thước tương tự như bản gốc với mỗi cột có giá trị giống như số hàng tương ứng:

test_row_order = array(seq(1:length(test[,1]), dim = dim(test)) 

Sau đó, chỉ cần áp dụng một hàm (n-th trong trường hợp này):

n_root = test^(1/test_row_order) 
Các vấn đề liên quan