2014-10-02 53 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 
相關問題