1

我有一个这样的循环:

library(writexl)
file_output="C:/test/test.xlsx"
for(i in 1:2){
    df<-iris[i,]
    write_xlsx(list(i=df),file_output)
    }

我想将每次迭代存储在名为i的的单独工作表中(或在我的实际程序中:某个变量的值)。是否可以使用 write_xlsx,或者一般来说,是否可以使 write_xlsx(或其他一些函数)解释:

“list(i=df)”为“list(1=df)”和“list(2=df)”

4

2 回答 2

1

您可能不需要 for 循环。

只需names()list对象上使用as.character()即可命名工作表。

l <- lapply(1:2, function(i) iris[i, ]) #creates separated df for each row
names(l) <- as.character(1:2) # sets the names of each element in the list
# these will be the sheets name


file="path_to_file.xlsx" # path to file name
library(writexl)

write_xlsx(l, file)
于 2019-03-01T09:21:27.010 回答
1

而不是i = df您必须命名列表元素。对于您的循环,这意味着:

file_output = "C:/test/test.xlsx"
for(i in 1:2){
  df <- iris[i,]
  out <- list(df)
  names(out) <- i
  write_xlsx(out, file_output)
}

但是,这将导致每个 data.frame 一个文件,因为write_xlsx不会附加到现有文件(至少据我所知)。如果您只想拥有一个包含各种 data.frames 工作表的文件,则必须调整您的代码:

file_output = "C:/test/test.xlsx"
vars <- 1:2
out <- vector(mode = "list", length = length(vars))
for(i in vars){ # if you use variable names in vars, use seq_along(vars) instead of vars
  out[[i]] <- iris[i,]
}
names(out) <- vars
write_xlsx(out, file_output)

由于我认为在这里使用循环没有任何好处,我什至建议mappurrr包中使用或lapply

file_output = "C:/test/test.xlsx"
vars <- 1:2
out <- map(vars, ~ iris[.x,])
names(out) <- vars
write_xlsx(out, file_output)
于 2019-03-01T09:22:35.690 回答