首页 > 解决方案 > 如何创建一个 for 循环来选择表中的列,从而生成单独的数据文件?

问题描述

我之前问过一个类似的问题,但是结果是一个列表,即使数据框被拆分,尽管有两列,它们也只包含一个变量,而且我尝试运行的函数只有在有两列时才会运行具有特定标题的列)。我特别需要这些表是单独的数据框。

我有一个大约 200 列的表(称为“书”),第一列是时间,然后是从 2 开始的实际数据。它看起来像这样:

Time 1 2 3 4 5 0 0 0 0 0 0 1 3 4 5 6 7 2 8 9 1 2 3 3 4 5 6 7 8

我需要将每一列拆分为单独的文件,所以它看起来像这样:

Time 1 0 0 1 3 2 8 3 4

然后

Time 2 0 0 1 4 2 9 3 5

等等。

我可以使用 dplyr 包和datafile1 <- select(book, Time, 2). 然后我可以将它导出到 excel 中,使用write_xlsx(datafile1, path = "1.xlsx", col_names = FALSE) 我并不特别想这样做 200 次(即datafile2 <- select(book, Time, 3)then write_xlsx(datafile2, path = "2.xlsx", col_names = FALSE)),所以我尝试创建一个 for 循环,以便我可以自动化该过程。

n=200

for(i in 2:n){
    file_name = paste("datafile", toString(i-1), sep="")
    file_name <- select(book, T, i)
    write_xlsx(datafile, path = "(i-1).xlsx", col_names = FALSE)
}

然而,循环似乎没有运行,它只为 i=200 运行一次。此外,最后创建的 excel 文件的名称是 (i-1) 而不是实际变量 - 1(即 200-1 应该已经199)。我想,好吧,我在某个地方搞砸了,文件的命名不能是变量。但是,如果我使用 path = "file_name.xlsx", col_name = FALSE,它仍将其称为 'file_name' 而不是我指定的 datafile199。

任何帮助将非常感激。

标签: rfor-loop

解决方案


你可以使用lapply

library(writexl)
library(dplyr)
library(purrr)

lapply(2:ncol(book), function(x) 
       write_xlsx(book[c(1, x)], path = paste0(x-1, ".xlsx"), col_names = FALSE))

或者如果你想在tidyverse

map(2:ncol(book), ~write_xlsx(select(book, c(1, .x)), 
    path = paste0(x-1, ".xlsx"), col_names = FALSE))

推荐阅读