我正在尝试使用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
我知道我错过了一些东西,但我无法明确指出是什么。
提前致谢。
答案 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')))