2015-12-02 37 views
1

我有一個數據幀:如何sapply做幾列在數據幀R和有結果的一個新列

val1 val2 val3 val4 val5 
5 2 6 7 2 
9 1 5 7 6 
2 3 5 7 1 

並需要使用VAL2,VAL3,VAL4值從各行的功能

aFunction <- function(v2,v3,v4) { 
    result = v2*2/v3 + max(max(v2,v3),v4) 
    return(result) 
} 

我需要這個函數的結果將被存儲在所述數據幀中的新列:

val1 val2 val3 val4 val5 result 
5 2 4 7 2 8 
9 3 2 7 6 10 
2 10 5 7 1 14 

但我不知道如何做到這一點,

我想過做

result = apply(df,function(x) {aFunction(x$val2,x$val3,x$val4)}) 

,但它似乎沒有工作

回答

1

你應該建立一個通用的函數。

newFunction <- function(a, b,c) { result= a*2/b +c; return(result)}

把那最大的三列。

newConstant <- max(max(df$val2, df$val3),df$val4)

使用sapply適用於列,並指定新的一列。

df$val5 <- sapply(df, newFunction, df$val2, df$val3, newConstant)

我不能現在就運行這個解決方案,但建立在理論上應該工作。

1

您可以使用使用自然動詞的dplyr包來完成整個過程。使用第二組中的例子號,這裏是你可以做什麼:

zz <- "val1 val2 val3 val4 val5 
1 5 2 4 7 2 
2 9 3 2 7 6 
3 2 10 5 7 1" 
Data <- read.table(text=zz, header = TRUE) # Creates the dataframe 

library(dplyr) 
Data %>% 
    rowwise() %>% 
    mutate(result = (val2 * 2/val3) + max(val2, val3, val4)) 

命令把你的數據,並表明它會評估一切rowwise()這是很重要的,這樣你就不能爲每個最大值在你的數據框中排。最後,mutate()會根據您提供的函數生成一個新變量。

要將數據保存到新元素,請在開頭使用newdata <-

1

您需要在調用函數時以不同的方式訪問列。該解決方案適用於您的例子:

df<-read.table(text="val1 val2 val3 val4 val5 
      5 2 6 7 2 
      9 3 2 7 6 
      2 10 5 7 1",header=T) 

aFunction <- function(v2,v3,v4) { 
v2*2/v3 + max(max(v2,v3),v4) 
} 

df$results<-apply(df,1,function(x) {aFunction(x[2],x[3],x[4])}) 

需要注意的是,即使這個答案專門解決你的問題,更優雅的解決方案是由其他的答案提供。

相關問題