【发布时间】:2016-11-21 13:31:36
【问题描述】:
我将 data.frame 列表作为自定义函数的输出,因此我打算将每个 data.frame 按其最后一列拆分,其中给出了阈值。但是,我很好地处理了这两个列表,并将它们组合起来只得到一个表。但是在操作这个新表时出现错误。我无法弄清楚问题来自哪里。我该如何解决这个错误?谁能指出我可能修复此错误?如果可以修复此错误,我想实现包装器。如何轻松操作 data.frame 列表?有更好的方法来调试错误吗?
小例子:
savedDF <- list(
bar = data.frame(.start=c(12,21,37), .stop=c(14,29,45), .score=c(5,9,4)),
cat = data.frame(.start=c(18,42,18,42,81), .stop=c(27,46,27,46,114), .score=c(10,5,10,5,34)),
foo = data.frame(.start=c(3,3,33,3,33,91), .stop=c(24,24,10,24,10,17), .score=c(22,22,6,22,6,7))
)
discardedDF <- list(
bar = data.frame(.start=c(16,29), .stop=c(20,37), .score=c(2,11)),
cat = data.frame(.start=c(21,31), .stop=c(23,43), .score=c(1,9)),
foo = data.frame(.start=c(54, 79), .stop=c(71,93), .score=c(3,8))
)
我可以这样操作:
both <- do.call("rbind", c(savedDF, discardedDF))
cn <- c("letter", "seq")
# FIXME :
DF <- cbind(
read.table(text = chartr("_", ".", rownames(both)), header=T, sep = ".", col.names = cn),
both)
DF <- transform(DF, isPassed = ifelse(.score > 8, "Pass", "Fail"))
by(DF, DF[c("letter", "isPassed")],
function(x) write.csv(x[-(1:length(savedDF))],
sprintf("%s_%s_%s.csv", x$letter[1], x$isPassed[1])))
但我有一个错误
Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, :
line 15 did not have 2 elements
为什么我有这个错误?谁能指出我如何解决这个问题?
我想要的输出是 CSV 文件列表,如下所示:
bar.saved.Pass.csv
bar.saved.Fail.csv
bar.discarded.Pass.csv
bar.discarded.Fail.csv
cat.saved.Pass.csv
cat.saved.Fail.csv
cat.discarded.Pass.csv
cat.discarded.Fail.csv
foo.saved.Pass.csv
foo.saved.Fail.csv
foo.discarded.Pass.csv
foo.discarded.Fail.csv
但我认为仍然不需要控制导出的 CSV 文件。如何改进此包装器的功能?我打算让使用自定义选择输出目录,或者更动态会很好。任何想法 ?非常感谢
【问题讨论】:
-
这似乎是来自
read.table()的错误,抱怨第 15 行的格式与文档的其余部分不匹配(即它不知道如何将第 15 行拆分为数据框列) -
预期输出是什么?它会是什么样子?
-
问题在于
rownames(both)来自discardedDF的最后三个名称是“bar”、“cat”、“foo”而不是“cat.x”......就像来自 savedDF 的行名 -
@user88911 查看该函数的最新版本并告诉我是否可行
-
@user88911 很乐意帮助朋友!
标签: r dataframe error-handling