2013-03-26 23 views
1

我試圖對兩個數據框的所有行和列應用函數,但我不知道如何使用apply來解決它。 我想下面的腳本解釋了我打算做的事情和我試圖解決它的方式。任何建議將受到熱烈的讚賞!請注意,simplefunction只是一個簡單示例函數。適用於R中的兩個不同數據框的所有列和行

# some data and a function 
df1<-data.frame(name=c("aa","bb","cc","dd","ee"),a=sample(1:50,5),b=sample(1:50,5),c=sample(1:50,5)) 
df2<-data.frame(name=c("aa","bb","cc","dd","ee"),a=sample(1:50,5),b=sample(1:50,5),c=sample(1:50,5)) 

simplefunction<-function(a,b){a+b} 

# apply on a single row 
simplefunction(df1[1,2],df2[1,2]) 

# apply over all colums 
apply(?) 

## apply over all columns and rows 
# create df to receive results 
df3<-df2 

# loop it 
for (i in 2:5)df3[i]<-apply(?) 
+0

也許你應該更精確地定義「適用於所有行和列」的含義,並提供真正可重複的功能和所需的輸出。 – juba 2013-03-26 15:38:55

+0

對不起,誤會。我編輯了上面的問題,包括這只是一個示例函數。該代碼是可重複的,我打算保持簡單,以便使其他人也可以使用。 – Joschi 2013-03-26 15:45:45

+0

+1提供一個簡單的可重複的例子(儘管它導致的誤解!)。 – 2013-03-26 15:46:53

回答

3

我的第一個mapply答案!爲了您的你有簡單的例子...

mapply(FUN = `+` , df1[,-1] , df2[,-1]) 
#   a b c 
# [1,] 60 35 75 
# [2,] 57 39 92 
# [3,] 72 71 48 
# [4,] 31 19 85 
# [5,] 47 66 58 

你可以擴展它像這樣...

mapply(FUN = function(x,y,z,etc){ simplefunctioncodehere} , df1[,-1] , df2[,-1] , ... other dataframes here) 

的dataframes將依次傳遞給函數,所以在這個例子DF1會x,df2將是y和z等等,它們是您按順序指定的其他數據框。希望這是有道理的。 mapply將取所有數據幀的第一行,第一列值並應用該函數,然後取所有數據幀的第一行第二列並應用該函數等。

+0

完美的作品。謝謝!! – Joschi 2013-03-26 15:40:45

2

您還可以使用Reduce

set.seed(45) # for reproducibility 
Reduce(function(x,y) { x + y}, list(df1[, -1], df2[,-1])) 
# a b c 
# 1 53 22 23 
# 2 64 28 91 
# 3 19 56 51 
# 4 38 41 53 
# 5 28 42 30 
+1

+1我總是喜歡看'Reduce'的例子。我不知道爲什麼。也許是因爲我不斷聽到'map/reduce' :-) – 2013-03-26 15:45:41

+0

我試過'Reduce',但是我得到的結果不是數據框的列表。任何想法爲什麼這可能是? – Joschi 2013-03-26 15:57:49

+0

什麼是數據?你可以用你正在使用的數據編輯原始文章嗎?在這個例子中,我找回了一個'data.frame'。 – Arun 2013-03-26 16:02:19

1

你可以這樣做:

df1[,-1] + df2[,-1] 

其中給出:

a b c 
1 52 24 37 
2 65 63 62 
3 31 90 89 
4 90 35 33 
5 51 33 45 
+0

這只是一個示例功能。我爲我的數據使用的功能要複雜得多,只能在腳本中使用其他功能和參數,所以我決定在這裏保持簡單。我會在上面編輯它... – Joschi 2013-03-26 15:31:57

相關問題