在数据框列表上使用轻拍

时间:2018-10-13 21:35:41

标签: r lapply tapply

我想使用oder上的数据帧列表来计算各个组的总和,然后将值0的出现列表化。在单个数据帧上,我会这样做:

sums <- tapply(my_data_frame$V3, my_data_frame$V2, sum)
table(unlist(sums==0))

由于我必须为多个文件计算该值,因此我将它们全部加载到列表中:

files <- Sys.glob("*txt")
listOfFiles <- lapply(files, function(x) read.table(x, skip = 1, sep = "\t"))
listOfFiles <- lapply(listOfFiles, function (x) na.omit(x))

我已经尝试过了,但是不起作用:

lapply(listOfFiles, tapply(
    lapply(listOfFiles, "[", c(2)),
    lapply(listOfFiles, "[", c(3)),
    sum)
)

有人可以给我任何提示吗?

1 个答案:

答案 0 :(得分:1)

考虑为您的read.tabletapplytable调用构建通用功能,并让lapply迭代读取文件并调用您的过程:

proc_sums <- function(myfile) {
   # READ FILE INTO DATA FRAME
   my_data_frame <- read.table(myfile, skip = 1, sep = "\t")
   my_data_frame <- na.omit(my_data_frame)

   # RUN GROUP SUMS
   sums <- tapply(my_data_frame$V3, my_data_frame$V2, sum)
   tbl <- table(unlist(sums==0))

   return(tbl)
}

files <- Sys.glob("*txt")
# ITERATE THROUGH FILES AND CALL PROCEDURE
list_of_sum_tables <- lapply(files, proc_sums)