f***a 发帖数: 329 | 1 Anyone has any idea? I have been facing such problems. Thanks! :)
#data set
dat <- matrix(1:10,,2)
colnames(dat) <- letters[1:2]
F <- function(a,b){a+b}
outer(1:2,4:6,F) #wokring
apply(dat,1,F) #not working. how to fix?
x <- 1:5
FF <- function(a,b){ sum(a*x+b) }
outer(1:2,4:6,FF)#not working. why? how to fix? | s*****n 发帖数: 2174 | 2
看报错的信息, FUN要求以dat的每一个行作为input, 你定义的F要求两个input, 当然
不行了. 如果是为了求和的话
apply(dat,1,sum)
报错是肯定的 FUN 要求是
'FUN' must be a function (or the name of it) which expects at
least two arguments and which operates elementwise.
你定义的FF 是以向量形式运算的. 解决的办法是人为elementize, 比如:
> x <- 1:5
> FF1 <- function(a,b){
+ lapply(seq(along=a), function(t) sum(a[t] * x + b[t]))
+ }
> outer(1:2,4:6,FF1)
[,1] [,2] [,3]
[1,] 35 40 45
[2,] 50 55 60
这个 FF1 和你那个 FF 的区别是, FF1 是 elementwise 的, 而你的FF
是vectorwise的.
【在 f***a 的大作中提到】 : Anyone has any idea? I have been facing such problems. Thanks! :) : #data set : dat <- matrix(1:10,,2) : colnames(dat) <- letters[1:2] : F <- function(a,b){a+b} : outer(1:2,4:6,F) #wokring : apply(dat,1,F) #not working. how to fix? : x <- 1:5 : FF <- function(a,b){ sum(a*x+b) } : outer(1:2,4:6,FF)#not working. why? how to fix?
| f***a 发帖数: 329 | 3 看报错的信息, FUN要求以dat的每一个行作为input, 你定义的F要求两个input, 当然
不行了. 如果是为了求和的话
apply(dat,1,sum)
~~~~~~~~~~~~~~~~~~~~~~
不是为了求和,这只是个例子。就是FUN在这种有两column的input的情况下我不知道该
怎么办算方便。用for循环太慢了吧,能不能用apply实现呢?
报错是肯定的 FUN 要求是
'FUN' must be a function (or the name of it) which expects at
least two arguments and which operates elementwise.
你定义的FF 是以向量形式运算的. 解决的办法是人为elementize, 比如:
> x <- 1:5
> FF1 <- function(a,b){
+ lapply(seq(along=a), function(t) sum(a[t] * x + b[t]))
+ }
> outer(1:2,4:6,FF1)
[,1] [,2] [,3]
[1,] 35 40 45 | s*****n 发帖数: 2174 | 4 第一个问题, 可以用apply实现. 但你要确定F的参数只有一个, 这个参数在实际操作中就是矩阵的每一行. 比如下面这个例子
dat <- matrix(1:10,,2)
colnames(dat) <- letters[1:2]
F <- function(t){t[1] + t[2]}
apply(dat,1,F)
注意定义的是 F(t), 而不是 F(t[1], t[2]).
seq(along=a) 在这里不是1, 而是6. 如果你觉得是1, 说明你没有理解outer的工作原理. outer(a, b, FUN) 的执行原理, 是先把a, b 做成相应的矩阵(本质还是向量)A, B, 然后一起传给FUN. FUN要对A和B的对应元素进行操作. 这里
a 是 (1,2), b是(4,5,6). 传递给FUN的分别是(1,2,1,2,1,2)和(4,4,5,5,6,6)
你定义的FF, 是把A和B看作向量来和x进行操作的, R会认为需要把一个长度为6的向量和一个长度为5的向量相乘, 然后再和一个长度为6的向量相加, 所以报错.
下面的例子可能能对你的理解有帮助:
x <- 1:5 | f***a 发帖数: 329 | |
|