应用于R中两个不同数据帧的所有列和行

时间:2013-03-26 15:26:21

标签: r dataframe apply

我尝试在两个数据帧的所有行和列上应用函数,但我不知道如何使用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(?)

3 个答案:

答案 0 :(得分: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将获取所有数据帧的第一行,第一列值并应用该函数,然后应用所有数据帧的第一行,第二列并应用该函数等等。

答案 1 :(得分: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

答案 2 :(得分: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