2013-08-23 20 views
2

鑑於這種data.frame結合R中的外部函數適用

x y z 
1 1 3 5 
2 2 4 6 

我想在dat添加列Xž加上一個係數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); 

回答

4

我不會在這裏使用apply。由於除了+操作被矢量,你可以使用

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

要在data.frame寫這篇文章的總和,不使用cbind,只需直接分配給它:

dat$result <- process.xz(dat$x, dat$z, Coeff) 
4

失敗的原因是因爲應用程序不能像那樣工作 - 您必須傳遞函數的名稱和任何其他參數。然後將數據框的行作爲第一個參數傳遞給(作爲單個向量的)命名函數。

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沒有意義 - 但無論如何理解都很好。