【问题标题】:Using tapply on a list of data frames在数据框列表上使用 tapply
【发布时间】:2018-10-13 21:35:41
【问题描述】:

我想在数据框列表上使用 tapply 来计算各个组的总和,然后将值 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)
)

有人可以给我一些提示吗?

【问题讨论】:

  • 你好马雷克。请阅读How to Create a Minimal, Complete, and Verifiable Example 并更新您的问题。另外,请在您的问题中解释什么是“组”。
  • 这不是数据框列表:my_data_frame$V3, my_data_frame$V2,它是列列表(或您称之为“个人组”)。您想按名称还是按索引引用列?
  • lapply(listOfFiles, "[", c(2))...c(3) 的意图只是从每个数据帧中分割第 2,3 列。有许多更简单的方法可以做到这一点,并重复问题。首先,您想使用什么数据结构来保存多个数据帧?列表?小标题?

标签: r lapply tapply


【解决方案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)

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多