0

我正在尝试使用 dplyr 和 purrr 包中的 map 函数从数据框中的列创建单独的文本文件,这样我就不必创建 for 循环并且可以使用现有的列名作为文件名对于新的 txt 文件。

这是数据框:

n = c(2, 3, 5) 
s = c("aa", "bb", "cc") 
b = c(TRUE, FALSE, TRUE) 
df = data.frame(n, s, b)

然后我创建了这个函数:

textfilecreate <- function(filename){
    filename1 <- noquote(names(filename))
    colunmname <- select(filename, filename1)
    myfile <- paste0( "_", colunmname, ".txt")
    write.table(colunmname, file = myfile, sep = "", row.names = FALSE, 
                col.names = FALSE, quote = FALSE, append = FALSE)
}

然后我调用了 map 函数:

map(data_link, textfilecreate)

我收到了这个错误:

Error in noquote(names(filename)) : attempt to set an attribute on NULL

我知道我遗漏了一些东西,但我无法确定是什么。

提前致谢。

4

2 回答 2

2

这里的困难map之一是一次循环遍历每一列,因此您最终处理的是值向量而不是 data.frame。这会导致您遇到的问题noquote

但是,您不需要select在此处执行任何 -ing,因为map将循环并返回每一列。剩下的问题是如何获取文件名的名称。

一种替代方法是同时遍历数据集和列名,使用名称创建文件名并将每列用作要保存的文件。我使用walk2而不是map2同时遍历两个列表,因为它不会创建新列表。

两个参数函数:

textfilecreate = function(filename, name){
        myfile = paste0( "_", name, ".txt")
        write.table(filename, file = myfile, sep = "", row.names = FALSE, 
                    col.names = FALSE, quote = FALSE, append = FALSE)
}

现在循环通过数据集和列名walk2。默认情况下,第一个列表用作第一个参数,第二个列表用作第二个参数。

walk2(df, names(df), textfilecreate)
于 2016-09-14T02:26:42.553 回答
0

您可以lapply像这样简单地使用:

lapply(names(df), function(colname) write.table(df[,colname],file=paste0(colname,'.txt')))
于 2016-09-14T00:54:28.573 回答