2014-06-13 23 views
1

我刚才写了使用lapply的意甲调用来转换数据,这样的功能:我应该如何链接lapply在R中惯用的顺序?

somefun <- function(directory, id = 1:332) { 
    filenames <- sprintf("%03d.csv", id) 
    filenames <- paste(directory, filenames, sep="/") 
    ldf <- lapply(filenames, read.csv) 
    cdf <- lapply(ldf,complete.cases) 
    icdf <- lapply(cdf,as.numeric) 
    sicdf <- lapply(cdf,sum) 
    result <- cbind(id,sicdf) 
    result 
} 

有没有更好的方式来写的lapplys在读该序列?

回答

0

您可以使用Reduce策略。下面是一些示例数据

xx<-matrix(runif(25), nrow=5) 
xx[2,3]<-NA 
write.table(xx, "num.txt") 

然后,你可以运行

trans<-list(
    read.table, 
    function(x) x[complete.cases(x),], 
    colSums 
) 

Reduce(lapply, trans, list("num.txt")) 

注意一些这些功能你lapply-ING可能无法正常工作,你会喜欢的方式。例如complete.cases根本不是子集,你可以看到我在转换列表中如何使用它。 as.numericsum也是如此。

6

这并不总是最好的方法,但我最喜欢简化一系列调用的方法是使用magrittr包。

它实质上创建了一个管道这种从一个命令转发参数到另一个命令。它确实对长链或这样的呼叫序列感到奇怪。周期/点可用于指定前一阶段的值是“传送”的位置。

尝试这样:

library(magrittr) # use install.packages("magrittr") if needed 

sprintf("%03d.csv", id) %>% 
    paste(directory, filenames, sep="/") %>% 
    lapply(read.csv) %>% 
    lapply(complete.cases) %>% 
    lapply(as.numeric) %>% 
    lapply(sum) %>% 
    cbind(id, .) 
相关问题