鉴于此data.frame
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);
答案 0 :(得分:4)
我不会在这里使用apply
。由于添加+
运算符已向量化,因此您可以使用
> process.xz(dat$x, dat$z, Coeff)
[1] 16 18
要在data.frame
中写下此内容,请勿使用cbind
,只需直接指定:
dat$result <- process.xz(dat$x, dat$z, Coeff)
答案 1 :(得分:4)
失败的原因是因为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)
我完全同意在这里使用申请没有意义 - 但无论如何都要理解。