1

我尝试在两个数据帧的所有行和列上应用一个函数,但我不知道如何用 apply 来解决它。我认为以下脚本解释了我打算做什么以及我试图解决它的方式。任何建议将不胜感激!请注意,这simplefunction只是一个示例函数,以使其保持简单。

# 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(?)
4

3 回答 3

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 )

数据帧将按顺序传递给函数,因此在此示例中,df1 将是 x,df2 将是 y,z 等将是您按该顺序指定的其他一些数据帧。希望这是有道理的。mapply将获取所有数据帧的第一行、第一列值并应用函数,然后是所有数据帧的第一行、第二列并应用函数,依此类推。

于 2013-03-26T15:33:48.653 回答
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
于 2013-03-26T15:29:12.670 回答
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
于 2013-03-26T15:29:54.227 回答