【问题标题】:Import multiple txt files with different dimensions and different sizes of names as separated dataframes将多个不同尺寸、不同名称大小的txt文件导入为单独的数据框
【发布时间】:2019-08-20 22:52:28
【问题描述】:

我有 2 个名为 In1B_HZM_VC_Suppl_astaxanthin.txtIn2B_HZM_VC_Suppl_beta-carotene.txt 的 txt 文件,结构如下:

#txt1
Result1 GSK3B   SNCA    SOD2    APP NDUFS7  CAT KCNJ6   TNF PIK3R1  NOS2    EDN1    GSR NOS3    NDUFB6  CASP3
Result2 NDUFS8  NDUFS2  NDUFS3  ETFDH   NDUFV2  SDHA    SDHB    NDUFV1  NDUFS1  NDUFS7
Result3 COQ2

#txt2
Result1 DDR1    CXCL8   MMP1    PTGS2   RPS6KA5 TNNT2
Result2 NQO1    IL1B    CYP1A1  SP1 LEPR    TNF POR HMOX1   TP53    GRIN1   NFE2L2  GJA1

我正在尝试找到一种方法将这 2 个文件作为单独的数据框导入,因为它们位于我的工作目录中的同一文件夹中。

我试过了:

files <- list.files(path = "C:/Users/user/Documents/HZM/SourceDatasets", pattern = "*.txt", full.names = T)

创建他们的模式和名称的列表

然后:

myfiles = lapply(files, read.delim) 

for (i in 1:length(files)) assign(files[i], read.delim(files[i]))

list2env(
  lapply(setNames(files, make.names(gsub("*.csv$", "", files))), 
         read.delim), envir = .GlobalEnv)

这给了我一个错误信息:

Error in read.table(file = file, header = header, sep = sep, quote = quote,  : 
  more columns than column names

我也试过了:

##Create list of data frame names without the ".csv" part 
names <-substr(files,44,68)

###Load all files
for(i in names){
  filepath <- file.path("C:/Users/user/Documents/HZM/SourceDatasets",paste(i,".txt",sep=""))
  assign(i, read.delim(filepath,
                       colClasses=c("character","factor",rep("numeric",4)),
                       sep = "\t"))
}

但我的 txt 文件的名称大小不一。

你可以找到文件here

【问题讨论】:

  • 为什么myfiles = lapply(files, read.delim) 不起作用?也许您需要将更多参数传递给read.delim
  • 喜欢你看到的文件
  • 我附上了它们

标签: r


【解决方案1】:

由于每行的列不相等,请尝试将read.tableheader = FALSEfill = TRUE 一起使用。

lapply(files, read.table, header = FALSE, fill = TRUE)

从 Dropbox 链接我可以将文件读取为

files <- list.files("/path/to/file/new/", full.names = TRUE)
files_list <- lapply(files, read.table, fill = TRUE)
lapply(files_list, function(x) x[1:2, 1:5])

#[[1]]
#       V1   V2    V3     V4    V5
#1 Result1 DDR1 CXCL8   MMP1 PTGS2
#2 Result2 NQO1  IL1B CYP1A1   SP1

#[[2]]
#       V1     V2   V3    V4   V5
#1 Result1 SCARB1 RXRA CASP3 ESR2
#2 Result2   BCO1                

【讨论】:

  • 当我将“文件”作为输入时,我得到:“FUN 中的错误(X[[i]],...):输入中没有可用的行”
  • @firmo23 我复制了与您在本地系统上的 2 个不同 txt 文件中提供的相同文本,并使用完全相同的代码读取它们,它为我提供了 2 个带有空字符串的数据帧的列表没有价值的地方。
  • 奇怪...为什么没有价值?
  • 我附上了文件
  • @firmo23 它仍然对我有用。检查更新的答案,我为两个表显示 2 行和 5 列。
【解决方案2】:

你没有指定你想要的输出。您只有几行,所以我假设您知道文件中的“名称”是什么。试试这个:

> # define the data in the question
> txt1 <- "Result1 GSK3B   SNCA    SOD2    APP NDUFS7  CAT KCNJ6   TNF PIK3R1  NOS2    EDN1    GSR NOS3    NDUFB6  ..." ... [TRUNCATED] 

> txt2 <- "Result1 DDR1    CXCL8   MMP1    PTGS2   RPS6KA5 TNNT2
+ Result2 NQO1    IL1B    CYP1A1  SP1 LEPR    TNF POR HMOX1   TP53    GRIN1   NFE2L2  ..." ... [TRUNCATED] 

> # you did not say how you wanted the data.  If you only want to get the
> # character sequences, you can use:
> 
> all_names <- scan(text = c(txt1, txt2), what = '')
Read 49 items

> print(all_names)
 [1] "Result1" "GSK3B"   "SNCA"    "SOD2"    "APP"     "NDUFS7"  "CAT"     "KCNJ6"   "TNF"    
[10] "PIK3R1"  "NOS2"    "EDN1"    "GSR"     "NOS3"    "NDUFB6"  "CASP3"   "Result2" "NDUFS8" 
[19] "NDUFS2"  "NDUFS3"  "ETFDH"   "NDUFV2"  "SDHA"    "SDHB"    "NDUFV1"  "NDUFS1"  "NDUFS7" 
[28] "Result3" "COQ2"    "Result1" "DDR1"    "CXCL8"   "MMP1"    "PTGS2"   "RPS6KA5" "TNNT2"  
[37] "Result2" "NQO1"    "IL1B"    "CYP1A1"  "SP1"     "LEPR"    "TNF"     "POR"     "HMOX1"  
[46] "TP53"    "GRIN1"   "NFE2L2"  "GJA1"   

> cat("\nUnique combinations\n\n")

Unique combinations


> print(unique(all_names))
 [1] "Result1" "GSK3B"   "SNCA"    "SOD2"    "APP"     "NDUFS7"  "CAT"     "KCNJ6"   "TNF"    
[10] "PIK3R1"  "NOS2"    "EDN1"    "GSR"     "NOS3"    "NDUFB6"  "CASP3"   "Result2" "NDUFS8" 
[19] "NDUFS2"  "NDUFS3"  "ETFDH"   "NDUFV2"  "SDHA"    "SDHB"    "NDUFV1"  "NDUFS1"  "Result3"
[28] "COQ2"    "DDR1"    "CXCL8"   "MMP1"    "PTGS2"   "RPS6KA5" "TNNT2"   "NQO1"    "IL1B"   
[37] "CYP1A1"  "SP1"     "LEPR"    "POR"     "HMOX1"   "TP53"    "GRIN1"   "NFE2L2"  "GJA1"   

【讨论】:

  • 我想要 2 个数据帧作为输出。我的 txt 在同一个文件夹 SourceDatasets 中,我应该使用文件路径导入它们
猜你喜欢
  • 2015-02-07
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
相关资源
最近更新 更多