从R中的数据框中的列创建文本文件而不进行for循环

时间:2016-09-14 00:18:06

标签: r dplyr purrr

我正在尝试使用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(data_link, textfilecreate)

我收到了这个错误:

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

我知道我错过了一些东西,但我无法明确指出是什么。

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

但是,您不需要在此执行任何select,因为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)

答案 1 :(得分:0)

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

lapply(names(df), function(colname) write.table(df[,colname],file=paste0(colname,'.txt')))