【问题标题】:Creating text files from column in data frame in R without for loop从R中数据框中的列创建文本文件而不使用for循环
【发布时间】:2016-09-14 00:18:05
【问题描述】:

我正在尝试使用 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

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

提前致谢。

【问题讨论】:

  • 如果您尝试noquote(names(df$n)),您将遇到同样的错误,因为map 会将函数应用于没有names 的每一列

标签: r dplyr purrr


【解决方案1】:

这里的困难之一是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)

【讨论】:

  • 这太棒了!正是我想要的。也感谢您的详细解释。
【解决方案2】:

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

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

【讨论】:

  • 非常感谢。
猜你喜欢
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 2016-05-09
相关资源
最近更新 更多