2

给定这个data.frame

  x y z
1 1 3 5
2 2 4 6

我想将xz列的值加上系数 10,为dat. 预期的结果是这样

  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);
4

2 回答 2

4

我不会在apply这里使用。由于加法+运算符是矢量化的,因此您可以使用

> process.xz(dat$x, dat$z, Coeff)
[1] 16 18

要在你的 中写这个data.frame,不要使用cbind,直接分配它:

dat$result <- process.xz(dat$x, dat$z, Coeff)
于 2013-08-23T04:01:19.307 回答
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)

我完全同意在此处使用 apply 毫无意义 - 但无论如何理解都很好。

于 2013-08-23T04:03:57.860 回答