【问题标题】:Combining loops and lapply结合循环和 lapply
【发布时间】:2014-06-15 13:23:07
【问题描述】:

我对 R 还是很陌生,并且真的觉得它很强大。我正在尝试创建具有多个级别的数据框。我有 3 组(科目),称为“group1”、“group2”和“group3”,每组有 19 个测试(名称无关紧要)。在这 19 个测试中,我感兴趣的 7 个组件中有 3 个称为 b1、b2 和 b3。

到目前为止我尝试了什么:对于每个患者,19 次测试形成 19 列和 7 行(组件)因此,我感兴趣的组件对于 19 次测试中的每一项都是 5、6、7:

sapply(x, '[', XXX, j)

我的最终代码是:

for (j in 1:19) {
   x = lapply(c('group1', 'group2', 'group3'), function(i) {
      filenames = dir(file.path('c:/19/7', i),
                 pattern = 'sRL.txt', full.names = T)
      x = lapply(filenames, read.table, sep = '')
      bb1 = sapply(x, '[', 5, j)
      bb2 = sapply(x, '[', 6, j)
      gg = sapply(x, '[', 7, j)
      pcode = as.numeric(gsub('_.*', '', basename(filenames)))
      data.frame(group = i, tests= j, pcode, b1= bb1, b2= bb2, g = gg)
   })
}

您能否建议如何创建一个漂亮的数据框,将每个组的每个主题的 19 个测试中的 5、6、7 个组件组合在一起?

【问题讨论】:

标签: r for-loop lapply sapply


【解决方案1】:

提供示例数据会更好,但在您的情况下,我可以看到这将是多么困难,因为文件的组织是您要处理的问题。

如果我的理解正确,每位患者都有自己的所有测试文件。每个文件有 19 列(每个测试一列)和 7 行(每个测试组件一行)。文件(患者)被组织成组,每个组位于不同的目录中。

作为输出,您希望每个文件的行 5:7,转置,因此每个组件有一列,每个测试有 1 行,每个患者,每个组。

我认为这可以做你想做的事,虽然没有完整的数据集是不可能测试的......

## not tested...
get.group <- function(g) {
  get.file <- function(x,g) {
    df <- read.table(x,sep="")
    data.frame(group=g, test=1:ncol(x), 
               pcode=gsub('_.*', '', basename(x)), t(x[5:7,]))
  }
  filenames <- dir(file.path('c:/19/7', g), pattern = 'sRL.txt', full.names = T)
  result    <- do.call(rbind,lapply(filenames,get.file,g))
}
final <- do.call(rbind,lapply(paste0("group",1:3),get.group))
colnames(final)[4:6] <- c("bb1","bb2","g")

所以从外到内:对于每个组,函数get.group(...) 被调用,结果按行绑定在一起。 get.group(...) 依次获取该组的文件名并为每个文件名调用get.file(...),将结果按行绑定在一起。最后,get.file(...) 读取文件并创建一个数据框,其中包含组名、患者代码、测试编号以及所有 19 项测试的三个组成部分的结果。

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 2020-03-02
    • 2018-08-25
    • 2013-04-27
    • 2012-12-03
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多