2014-10-02 56 views
1

我有许多dataframes类似下面:r使用的功能列表提供给同一组输入

> dput(df) 
structure(list(x1 = c(0.5, 0.65, 0.67, 0.6, 0.52, 0.47, 0.42, 
0.41, 0.4, 0.38), x2 = c(88.2759008383549, 88.4629768937181, 
88.6351264139755, 88.7928788760014, 88.9363150101317, 89.0654802835256, 
89.1805310339952, 89.2816679977014, 89.3690643397432, 89.4429508602581 
), x3 = c(0.44, 0.8, 8.6, 2.72, 0.06, 0, 0, 0, 0, 0.04)), .Names = c("x1", 
"x2", "x3"), row.names = c(NA, -10L), class = "data.frame") 

欲可变数量的函数应用到每个data.frame。

下面是3种功能的例子:

library(tiger) 

f1 <- function(x1,x2) lagtime(x1,x2) 
f2 <- function(x1,x2) mean(x1 - x2, na.rm = TRUE)   
f3 <- function(x2,x3) sum(x2) /sum(x3) 

myVector <- c(f1(df$x1,df$x2), 
       f2(df$x1,df$x2), 
       f3(df$x2,df$x3)) 

> myVector 
[1] -6.00000 -88.44229 70.25615 

但是,如果我有N个函数列表:

funs <- list(f1, f2, f3, ..., fn) 

我应该lapply(或其他功能)使用,但如何?

+0

由于功能上的dataframes自己的,而不是在dataframes列进行操作,他们操作上是可变的列,真的不会有一个干净的方式来做到这一点。如果您重写了在数据框上操作的函数,那么这将是微不足道的。 – stanekam 2014-10-02 21:20:21

+0

我应该如何重写函数? – Claudia 2014-10-02 21:40:07

+0

你看他们是如何服用载体的吗?使它成为数据框。在你的情况下,它将涉及到改变输入到'df'并在'x1','x2' ...'xn'之前添加'df $'。 – stanekam 2014-10-02 21:46:44

回答

1

重写功能,因此他们采取了数据帧的参数和使用的名称为列参数:

> f1 <- function(df, nm1 ='x1',nm2='x2') lagtime(df[[nm1]],df[[nm2]]) 
> f2 <- function(df, nm1 ='x1',nm2='x2') mean(df[[nm1]] - df[[nm2]], na.rm = TRUE)   
> f3 <- function(df, nm2 ='x2',nm3='x3') sum(df[[nm2]]) /sum(df[[nm3]]) 

然后遍历所有的功能和dataframes:

funs <- list(f1, f2, f3) 
dfs <- list(df1,df1) 

lapply(funs, function(f) sapply(dfs, function(d) f(d))) 
#------------------ 
[[1]] 
[1] -6 -6 

[[2]] 
[1] -88.44229 -88.44229 

[[3]] 
[1] 70.25615 70.25615 
+0

这正是我想要的!非常感谢! – Claudia 2014-10-03 08:47:30

0

为什么不把他们全部纳入一个功能?这里我用median代替lagtime

返回一个列表:

> foo <- function(x, y, z, ...) { 
     list(median = median(c(x, y)), 
      mean = mean(x - y, ...), 
      quotient = sum(y)/sum(z)) 
    } 

> foo(df$x1, df$x2, df$x3, na.rm = TRUE) 
# $median 
# [1] 44.47295 
# 
# $mean 
# [1] -88.44229 
# 
# $quotient 
# [1] 70.25615 

或作为载体:

foo2 <- function(x, y, z, ...) { 
    c(median = median(c(x, y)), 
     mean = mean(x - y, ...), 
     quotient = sum(y)/sum(z)) 
} 
foo2(df$x1, df$x2, df$x3, na.rm = TRUE) 
# median  mean quotient 
# 44.47295 -88.44229 70.25615 
相关问题