【问题标题】:Subset a list of data frames - error when writing output子集数据帧列表 - 写入输出时出错
【发布时间】:2014-05-15 12:43:24
【问题描述】:

我在 4 个不同的位置有 4 个不同的 .csv 文件,我想使用相同的标准对它们进行子集化。然后我想为它们中的每一个以“originalfilename_cpt.csv”的形式编写输出(最好是原始位置,但我已经放弃了——不介意将它们写入工作区并手动移动它们)

因为它们在不同的位置,我从单独阅读文件开始:

data1 <- read.csv("Subsets\\Folder1\\data1.csv")
data2 <- read.csv("Subsets\\Folder2\\data2.csv")
data3 <- read.csv("Subsets\\Folder3\\data3.csv")
data4 <- read.csv("Subsets\\Folder4\\data4.csv")

然后创建一个包含所有文件的列表:

mylist <- list(data1, data2, data3, data4)

从这里我尝试了 2 条路线 - 首先创建了一个函数并使用了 lapply:

MyFunction <- function(file){
  clean.file <- file[(file$pingtimehrs < 3.334), ]
  write.csv(clean.file, file=paste(file, "_cpt.csv", sep=""), row.names = F)
}

lapply(mylist, MyFunction)

第二次使用了for循环:

for (file in mylist){
  clean.file <- file[(file$pingtimehrs < 3.334), ]
  write.csv(clean.file, file=paste(file, "_cpt.csv", sep=""), row.names = F)
}

在这两种情况下我都会遇到相同的错误,我怀疑这与编写输出有关,因为我可以看到我的 clean.file 正在创建(至少是第一个)并且它看起来正确。这是我得到的错误:

Error in file(file, ifelse(append, "a", "w")) : 
  invalid 'description' argument

In addition: Warning message:
In if (file == "") file <- stdout() else if (is.character(file)) { :
  the condition has length > 1 and only the first element will be used

谁能发现我做错了什么?

【问题讨论】:

  • file 似乎是一个data.frame?使用 "_cpt.csv" 粘贴 data.frame 不会产生好的文件名。
  • file 是列表的每个元素,是的,是数据帧。那是问题吗?那我怎样才能得到file的名字呢?

标签: r list for-loop lapply write.table


【解决方案1】:

试试这个:

for (i in seq_along(mylist)){
  clean.file <- mylist[[i]][(mylist[[i]]$pingtimehrs < 3.334), ]
  write.csv(clean.file, file=paste(names(mylist)[i], "cpt.csv", sep="_"), row.names = F)
}

【讨论】:

  • 谢谢罗兰!但是,这只是对mylist 中的第一个元素进行子集化,并为其他元素生成空输出。它还使用它们在mylist 中的索引而不是它们的名称来命名我的输出 - 我得到“1_cpt.csv”而不是“data1_cpt.csv”
  • 我没有可重现的示例,但我怀疑您的子集步骤 pingtimehrs &lt; 3.334 负责空输出。我已经解决了命名问题。
  • 忘记我所说的关于您的代码创建空输出的内容 - 我的错误!我会试试你对文件名的编辑。
  • 好吧,刚刚尝试了您的编辑,我得到了一个名为 "_cpt.csv" 的文件。我还输入了names(mylist) 并得到NULL。我有点困惑:为什么我的列表不知道它的元素名称?
  • 好的,我知道我的列表是一个未命名的列表。我尝试创建一个命名列表,但除非我将列表中的每个元素命名为与原始文件名完全相同,否则我仍然不会将最终输出命名为“originalfilename_cpt.csv”(这对于@987654328 来说似乎很简单@ 和 data1.csv,但与真实文件名不同)。所以我认为这条路线会很复杂,而不是简化代码和任务——我将不得不考虑其他事情。不过还是谢谢你的帮助,至少我现在明白问题出在哪里了!
猜你喜欢
  • 2019-09-01
  • 1970-01-01
  • 2017-11-08
  • 2018-03-06
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多