在R

2013-04-30 58 views
1

中用多參數用戶定義函數向數據框添加一列我有一個包含8個整數列(約1000行數據)的數據框x。我創建了一個UDF「測試」,它接受8個整型參數並返回一個值。我已經通過傳遞任意整數值來測試UDF,它確實返回一個值,所以我知道它的工作原理。我想現在將它逐行傳遞給8個整數列,並讓它返回值作爲數據框中每一行的新列。我試過x$NewColumn = test(x$Col1, x$Col2 .... x$Col8),但該函數返回一個錯誤,提示數據未被正確傳遞。有人能告訴我我做錯了什麼嗎?在R

+2

歡迎堆棧溢出!請爲這裏的優秀人士添加可重複的樣本以幫助您。請參閱http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – 2013-04-30 16:06:47

回答

0

嘗試使用apply功能,在您data.frame的行運行:

## Create some data 
df <- as.data.frame(matrix(runif(40),10)) 

## Now we can use 'apply'. The '1' in the second argument means we apply across rows, if it were two we would apply across columns. 
## The function we are applying to each row is to sum all the values in that row 
df$Total <- apply(df , 1 , sum) 


## We can also pass 'anonymous' functions. In this instance our function takes a single vector, 'x' 
## 'x' is all the values of that row, and we can use them like so to do the same thing as 'sum' in the previous example 
df$Function <- apply(df , 1 , function(x) x[1] + x[2] + x[3] + x[4]) 

## And if we see what is in df, 'df$Total' and 'df$Function' should have the same values 
df 
#   V1  V2   V3  V4 Total Function 
#1 0.6615353 0.5900620 0.02655674 0.1036002 1.381754 1.381754 
#2 0.8471900 0.8927228 0.77014101 0.6379024 3.147956 3.147956 
#3 0.8783624 0.6769206 0.09598907 0.6681616 2.319434 2.319434 
#4 0.7845933 0.8992605 0.13271067 0.3691835 2.185748 2.185748 
#5 0.9753706 0.1374564 0.12631014 0.3693808 1.608518 1.608518 
#6 0.4229039 0.7590963 0.79936058 0.2674258 2.248787 2.248787 
#7 0.2635403 0.6454591 0.98748926 0.5888263 2.485315 2.485315 
#8 0.7008617 0.7505975 0.39355439 0.5943362 2.439350 2.439350 
#9 0.1169755 0.1961099 0.88216054 0.3383819 1.533628 1.533628 
#10 0.3298974 0.0110522 0.88460835 0.3700531 1.595611 1.595611 
+0

您也可以使用colSums(df)'。 – 2013-04-30 16:09:31

+0

@Jilber在這個例子中是的,但是OP有一個未定義的'函數',它取所有的值並且吐出一個值。目前還不清楚這個函數是否是一個簡單的總和,因此我的第二個例子。 – 2013-04-30 16:11:33

+0

我不確定我完全明白你的意思。我理解apply函數的基礎知識,但我不確定在我的情況下使用的語法。從我在你的例子中可以看到的,你已經創建了一個函數(x),它帶有一個參數,它是4列的總和。如何將其轉換爲我的情況,我有一個預定義的UDF並需要傳遞多個參數? – zgall1 2013-04-30 16:11:59

1

你可以使用mapply

mapply(test, x$Col1, x$Col2 .... x$Col8) 
+0

在這種情況下,您認爲「應用」是否更方便?數據已經在'data.frame'中。 'mapply'是許多方法中的一種,但OP *應該使用最適合的方法。我不同意他們*應該*使用'mapply',因爲它似乎不太方便,但他們*可以*。 – 2013-04-30 16:20:45

+0

'apply'首先將'data.frame'轉換爲'matrix',這可能不是我們想要的。 – 2013-04-30 16:28:03

+0

OP已經聲明他們有整數值的列。 – 2013-04-30 16:32:37

1
df = data.frame(matrix(runif(80),ncol=8)) 
# creation of a matrix for the example 

my.function = function (x) { return (mean(x)) } # write your function 

# and then use the apply function 

new.column = apply(df,1, my.function) 

df$new.column = new.column