应用'复杂'功能n次并使用来自两个独立数据帧的列的数据记录结果

时间:2014-12-10 23:15:21

标签: r dataframe apply lapply

我有两个相同维度的数据框,数据以这种方式组织(简化的复制示例,每个数据框在我的问题中具有重要意义):

df1 <- data.frame(Col1=sample(1000,5),Col2=sample(1000,5))
df2 <- data.frame(Col1=sample(1000,5),Col2=sample(1000,5))

我还有一个相对复杂的函数,它也返回一个数据帧。输入参数分别是df1df2的列。例如:

# if we just run the function for Col1's and other set parameters x,y,z,l,m
# USER_FUNCTION(df1col's,df2col's,x,y,z,l,m...)

> tmp <- USER_FUNCTION(df1[[1]],df2[[1]],x,y,z,l,m)

# the function spits out a dataframe with three columns A,B,C
# column A is a vector of numbers, column B is a vector of strings
# column C is vector of our future rownames
# the rownames are dates pulled from df1 and df2, and stored as strings
> tmp
            A          B           C
1        number1     string1     rownames1
2        number2     string2     rownames2

我目前的解决方案是以这种方式遍历df1df2

newdf <- data.frame()
for(m in 1:ncol(df1)){

  tmp <- USER_FUNCTION(df1[[m]],df2[[m]],x,y,z,l,m)
  newdf <- rbind(newdf,tmp)
}

这允许我创建一个newdf,其中包含使用USER_FUNCTIONdf1列作为输入参数应用df2的所有结果。

df1df2为6000x250(完成所有迭代大约需要4秒)时,循环方法并不差。但是,我最近将我的数据集扩展到6000x500,有时需要更长的时间。

我对apply()类型函数(或lapply()mapply()等)不太熟悉。我想知道是否有更有效的方法来实现newdf

的最终目标

1 个答案:

答案 0 :(得分:1)

尝试:

do.call(rbind, lapply(1:ncol(df1), function(m) USER_FUNCTION(df1[[m]],df2[[m]],x,y,z,l,m)))