给定此数据。帧
x y z
1 1 3 5
2 2 4 6
对于dat
中的每一行,我想将x和z列的值加上系数10。预期结果是这个
x y z result
1 1 3 5 16 #(1+5+10)
2 2 4 6 18 #(2+6+10)
但是为什么这个代码没有产生想要的结果呢?
dat <- data.frame(x=c(1,2), y=c(3,4), z=c(5,6))
Coeff <- 10
# Function
process.xz <- function(v1,v2,cf) {
return(v1+v2+cf)
}
# It breaks here
sm <- apply(dat[,c('x','z')], 1, process.xz(dat$x,dat$y,Coeff ))
# Later I'd do this:
# cbind(dat,sm);
我不会在这里使用apply
。由于加法+
算子是矢量化的,因此可以使用获得和
> process.xz(dat$x, dat$z, Coeff)
[1] 16 18
要在data.frame
中写入此内容,请不要使用cbind
,只需直接分配:
dat$result <- process.xz(dat$x, dat$z, Coeff)
它失败的原因是apply不能像那样工作——您必须传递函数的名称和任何其他参数。然后将数据帧的行作为第一个参数(作为单个向量)传递给名为的函数。
dat <- data.frame(x=c(1,2), y=c(3,4), z=c(5,6))
Coeff <- 10
# Function
process.xz <- function(x,cf) {
return(x[1]+x[2]+cf)
}
sm <- apply(dat[,c('x','z')], 1, process.xz,cf=Coeff)
我完全同意在这里使用apply没有意义,但无论如何,理解它都很好。