R无法检测到我在加载的文件中有不止一列

时间:2018-10-17 17:01:07

标签: r

我想要做的是获取我所在子目录中的每个文件,实际上只是将列标题名称向左移了一个。

Example of my data table

我尝试通过在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

任何帮助将不胜感激。

2 个答案:

答案 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)