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