我想要做的是获取我所在子目录中的每个文件,实际上只是将列标题名称向左移了一个。
我尝试通过在for循环中使用fread
来实现这一点:
library(data.table)
## I need to write this script to reorder the column headers which are now apparently out of wack
## I just need to shift them over one
filelist <- list.files(pattern = ".*.txt")
for(i in 1:length(filelist)){
assign(filelist[[i]], fread(filelist[[i]], fill = TRUE))
names(filelist[[i]]) <- c("RowID", "rsID", "PosID", "Link", "Link.1","Direction", "Spearman_rho", "-log10(p)")
}
但是,我不断收到以下错误消息或以下错误消息的变种:
Error in names(filelist[[i]]) <- c("RowID", "rsID", "PosID", "Link", "Link.1", :
'names' attribute [8] must be the same length as the vector [1]
这让我感到困惑,因为正如您在上面清楚看到的那样,R Studio能够以正确的列数加载文件。但是,错误消息似乎暗示只有一列。我尝试了不同的功能,例如colnames
,甚至尝试将分隔符定义为双引号(因为我的文件以前是由另一个用引号引起来的R脚本生成的),所以很不幸。实际上,如果我尝试这样定义分隔符:
for(i in 1:length(filelist)){
assign(filelist[[i]], fread(filelist[[i]], sep = "\"", fill = TRUE))
names(filelist[[i]]) <- c("RowID", "rsID", "PosID", "Link", "Link.1","Direction", "Spearman_rho", "-log10(p)")
}
我收到以下错误:
Error in fread(filelist[[i]], sep = "\"", fill = TRUE) :
sep == quote ('"') is not allowed
任何帮助将不胜感激。
答案 0 :(得分:1)
我认为问题在于,尽管有list.files
的名字,但它返回一个字符向量,而不是list
。因此,使用[[
是不正确的。然后,使用assign
,创建一个与文件同名的对象(不是一个好习惯,最好使用列表)。然后,您尝试修改创建的对象的名称,但只能使用对象名称的字符串。要使用名称在字符串中的对象,您需要使用get
(这就是为什么使用list
比创建一堆对象更好的原因之一)。
更明确地说,假设filelist = c("data1.txt", "data2.txt")
。然后,当i = 1
时,此代码:assign(filelist[[i]], fread(filelist[[i]], fill = TRUE))
创建一个名为data1.txt
的数据表。但是您的下一行names(filelist[[i]]) <- ...
不会修改您的数据表,它会修改filelist
的第一个元素,即字符串"data1.txt"
,而该字符串的长度确实为{{1} }。
我建议您将文件读入列表,而不要使用1
创建对象。
assign
要更改名称,可以改用filelist <- list.files(pattern = ".*.txt")
datalist <- lapply(filelist, fread, fill = TRUE)
names(datalist) <- filelist
:
data.table::setnames
但是,for(dt in datalist) setnames(dt, c("RowID", "rsID", "PosID", "Link", "Link.1","Direction", "Spearman_rho", "-log10(p)"))
有一个fread
参数,因此您可以直接在读取步骤中进行操作:
col.names
我还建议不要使用my_names <- c("RowID", "rsID", "PosID", "Link", "Link.1","Direction", "Spearman_rho", "-log10(p)")
datalist <- lapply(filelist, fread, fill = TRUE, col.names = my_names)
作为列名-非标准的列名(带有parens和"-log10(p)"
)通常比其价值更大。 >
答案 1 :(得分:0)
您能否运行以下代码来更仔细地查看要放入文件列表中的内容?
i <- 1
assign(filelist[[i]], fread(filelist[[i]], fill = TRUE))
print(filelist[[i]])
我怀疑您可能需要使用下面的代码而不是assign语句
filelist[[i]] <- fread(filelist[[i]], fill = TRUE)