我有一个包含40个文件的文件夹(虽然我想编写代码以便它可以处理任意数量的文件,因为这会一直出现在我身上)。我想要做的就是获取一个新文件,将所有这些文件一起编译为列。每个文件包含5列,每列有902行。
这就是我写的:
Specs2 <- function()
{
allspecs2 <- NULL
fnames2 <- scan(file.choose(), what = "character", quiet = TRUE)
print(fnames2)
for (i in fnames2)
{
dat2 <- read.table(paste("E:\\Post-doc Data\\Colour- Temperature\\Compiled Sets Rows\\",i, sep=""))
value <- data.frame(dat2)
allspecs2 = cbind(allspecs2, value)
}
allspecs2 <- data.frame(allspecs2)
write.table(allspecs2, "E:\\Post-doc Data\\Colour- Temperature\\Colour-Temperature_Columns.csv", row.names = FALSE, quote = FALSE)
}
Specs2()
当提示您选择文件时,我选择一个文件,其中包含我要编译的文件夹中所有文件的列表。当我运行此代码时,我收到以下错误代码:
"Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 902"
但我编译的所有文件都有相同的行数和列数。有谁知道我为什么会收到此错误或如何解决?或者用不同的编码方式来实现同样的目的?
谢谢!
编辑:所以在阅读了MrFlicks的回答之后,我理解为什么他的代码有效但我在成功之前使用了相同类型的代码:
Specs1 <- function()
{
allspecs1 <- NULL
dirnames <- scan(file.choose(), what = "character", quiet = TRUE)
print(dirnames)
for (j in dirnames)
{
fnames1 <- list.files(path = paste("E:\\Post-doc Data\\Colour-Temperature\\Specs\\",j, sep = ""), pattern = NULL, all.files = FALSE,
full.names = FALSE, recursive = FALSE,
ignore.case = TRUE, include.dirs = FALSE, no.. = FALSE)
print(fnames1)
for (i in fnames1)
{
dat1 <- read.table(paste("E:\\Post-doc Data\\Colour-Temperature\\Specs\\",j,"\\",i, sep=""), skip = 17)
smoothed <- ksmooth(dat1[,1], dat1[,2], kernel = "box", bandwidth = 10, x.points = seq(300, 2100, 2))
allspecs1 = cbind(allspecs1, smoothed$y)
}
allspecs1 = cbind(smoothed$x, allspecs1)
allspecs1 <- data.frame(allspecs1)
write.table(allspecs1, paste("E:\\Post-doc Data\\Colour-Temperature\\Compiled Sets Rows\\",j, ".txt"), row.names = FALSE, col.names = FALSE, quote = FALSE)
rm(allspecs1)
allspecs1 = NULL
}
}
Specs1()
我只是想了解为什么它有效而不是其他人?
谢谢!
答案 0 :(得分:0)
您收到该错误的原因与此错误相同
cbind(NULL, data.frame(a=1))
# Error in data.frame(..., check.names = FALSE) :
# arguments imply differing number of rows: 0, 1
首先定义allspecs2 <- NULL
,当你将cbind
第一个data.frame转到该空值时,就会触发错误。
最好先检查allspecs2
是否包含任何行/列。 <怎么样
Specs2 <- function()
{
allspecs2 <- NULL
fnames2 <- scan(file.choose(), what = "character", quiet = TRUE)
print(fnames2)
for (i in fnames2) {
value <- read.table(paste("E:\\...\\",i, sep=""))
if ( is.null(allspecs2) ) {
allspecs2 <- value
} else {
allspecs2 <- cbind(allspecs2, value)
}
}
write.table(allspecs2, "E:\\...\\file.csv", row.names = FALSE, quote = FALSE)
}
Specs2()