Tôi có khung và vectơ dữ liệu sau.Làm cách nào để áp dụng hàm đa tham số trong R?
> y
v1 v2 v3
1 1 6 43
2 4 7 5
3 0 2 32
> v
[1] 1 2 3
Tôi muốn áp dụng các chức năng sau đây để mỗi ROW ở chỗ khung dữ liệu đó mà v được thêm vào mỗi ROW của y:
x <- function(vector1,vector2) {
x <- vector1 + vector2
}
... để có được các kết quả này:
v1 v2 v3
1 2 8 46
2 5 9 8
3 1 4 35
mapply áp dụng các chức năng để COLUMNS:
> z <- mapply(x, y, MoreArgs=list(vector2=v))
> z
v1 v2 v3
[1,] 2 7 44
[2,] 6 9 7
[3,] 3 5 35
Tôi đã thử transposing khung dữ liệu để các chức năng sẽ được áp dụng cho các hàng và cột không, nhưng mapply mang lại cho tôi kết quả kỳ lạ sau khi transposing:
> transposed <- t(y)
> transposed
[,1] [,2] [,3]
v1 1 4 0
v2 6 7 2
v3 43 5 32
> z <- mapply(x, transposed, MoreArgs=list(vector2=v))
> z
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 2 7 44 5 8 6 1 3 33
[2,] 3 8 45 6 9 7 2 4 34
[3,] 4 9 46 7 10 8 3 5 35
... Help?
############################ EDIT ################# ########
Cảm ơn tất cả các câu trả lời! Tôi đang học rất nhiều hàm R mới mà tôi chưa bao giờ thấy trước đây, điều này thật tuyệt vời.
Tôi muốn làm rõ câu hỏi trước đây của mình một chút. Điều tôi thực sự hỏi là một câu hỏi tổng quát hơn - cách áp dụng một hàm đa tham số cho mỗi hàng trong R (tại thời điểm này, tôi bị cám dỗ để kết luận rằng tôi chỉ nên sử dụng một vòng lặp, nhưng tôi muốn tìm ra nếu nó là có thể, chỉ để tham khảo trong tương lai ...) (Tôi cũng cố ý kiềm chế hiển thị mã tôi đang làm việc với vì nó là loại lộn xộn).
tôi đã cố gắng sử dụng chức năng quét như đã được đề nghị, nhưng tôi nhận được lỗi sau:
testsweep <- function(vector, z, n) {
testsweep <- z
}
> n <- names(Na_exp)
> n
[1] "NaCl.10000.2hr.AVG_Signal" "NaCl.10000.4hr.AVG_Signal"
> t <- head(Li_fcs,n=1)
> t
LiCl.1000.1hr.FoldChange LiCl.2000.1hr.FoldChange LiCl.5000.1hr.FoldChange
[1,] -0.05371838 -0.1010928 -0.01939986
LiCl.10000.1hr.FoldChange LiCl.1000.2hr.FoldChange
[1,] 0.1275617 -0.107154
LiCl.2000.2hr.FoldChange LiCl.5000.2hr.FoldChange
[1,] -0.06760782 -0.09770226
LiCl.10000.2hr.FoldChange LiCl.1000.4hr.FoldChange
[1,] -0.1124188 -0.06140386
LiCl.2000.4hr.FoldChange LiCl.5000.4hr.FoldChange
[1,] -0.04323497 -0.04275953
LiCl.10000.4hr.FoldChange LiCl.1000.8hr.FoldChange
[1,] 0.03633496 0.01879461
LiCl.2000.8hr.FoldChange LiCl.5000.8hr.FoldChange
[1,] 0.257977 -0.06357423
LiCl.10000.8hr.FoldChange
[1,] 0.07214176
> z <- colnames(Li_fcs)
> z
[1] "LiCl.1000.1hr.FoldChange" "LiCl.2000.1hr.FoldChange"
[3] "LiCl.5000.1hr.FoldChange" "LiCl.10000.1hr.FoldChange"
[5] "LiCl.1000.2hr.FoldChange" "LiCl.2000.2hr.FoldChange"
[7] "LiCl.5000.2hr.FoldChange" "LiCl.10000.2hr.FoldChange"
[9] "LiCl.1000.4hr.FoldChange" "LiCl.2000.4hr.FoldChange"
[11] "LiCl.5000.4hr.FoldChange" "LiCl.10000.4hr.FoldChange"
[13] "LiCl.1000.8hr.FoldChange" "LiCl.2000.8hr.FoldChange"
[15] "LiCl.5000.8hr.FoldChange" "LiCl.10000.8hr.FoldChange"
Nhưng khi tôi cố gắng áp dụng quét ...
> test <- sweep(t, 2, z, n, FUN="testsweep")
Error in if (check.margin) { : argument is not interpretable as logical
In addition: Warning message:
In if (check.margin) { :
the condition has length > 1 and only the first element will be used
Khi tôi loại bỏ các n tham số từ ví dụ kiểm tra này, quét hoạt động tốt. Điều này gợi ý cho tôi rằng việc quét không thể được sử dụng trừ khi tất cả các tham số được cung cấp để quét hoặc là cùng một số cột như vector t, hoặc độ dài 1. Vui lòng sửa tôi nếu tôi bị nhầm lẫn ...
Tôi chắc chắn sẽ xem xét mdply tạo thành gói plyr. Điều này chính xác làm những gì bạn yêu cầu. –
Tôi chắc chắn sẽ xem mdply mẫu gói plyr. Điều này chính xác làm những gì bạn yêu cầu. –