【问题标题】:Extract data from text files using for loop使用 for 循环从文本文件中提取数据
【发布时间】:2017-05-27 15:48:17
【问题描述】:

我有 40 个带有名称的文本文件:

[1] "2006-03-31.txt" "2006-06-30.txt" "2006-09-30.txt" "2006-12-31.txt" "2007-03-31.txt"
[6] "2007-06-30.txt" "2007-09-30.txt" "2007-12-31.txt" "2008-03-31.txt" etc... 

我需要提取一个特定的数据,我知道如何单独完成,但这需要一段时间:

m_value1 <- `2006-03-31.txt`$Marknadsvarde_tot[1]
m_value2 <- `2006-06-30.txt`$Marknadsvarde_tot[1]
m_value3 <- `2006-09-30.txt`$Marknadsvarde_tot[1]
m_value4 <- `2006-12-31.txt`$Marknadsvarde_tot[1] 

有人可以帮我用一个 for 循环来从所有不同的文本文件中提取特定列和行的数据吗?

【问题讨论】:

  • gsub("\\..*","", yourstring)? See this
  • 嗯,我需要从几个文本文件中的变量Marknadsvarde_tot 中获取数据,但我不知道如何遍历不同的文本文件然后获取值。 Posttyp=2006-03-31 Kvartalsslut =58052 Institutnr_fondbolag=Nordea Fonder Marknadsvarde_tot=7896558077

标签: r


【解决方案1】:

假设您的文件都在同一个文件夹中,您可以使用list.files 获取所有文件的名称,然后遍历它们并获取您需要的值。所以是这样的吗?

m_value<-character() #or whatever the type of your variable is
filelist<-list.files(path="...", all.files = TRUE)
for (i in 1:length(filelist)){
   df<-read.table(myfile[i], h=T)
   m_value[i]<-df$Marknadsvarde_tot[1]
}

编辑:

如果您已经导入了所有可以使用的数据get

txt_files <- list.files(pattern = "*.txt") 
for(i in txt_files) { x <- read.delim(i, header=TRUE) assign(i,x) }

m_value<-character()
for(i in 1:length(txt_files)) {
  m_value[i] <- get(txt_files[i])$Marknadsvarde_tot[1]
}

【讨论】:

  • 谢谢@GyB。我已经尝试了提供的 for 循环,但收到一条错误消息:Error in read.table(myfile[i], h = T) : object 'myfile' not found。我知道这是要从中读取数据的文件的名称,但所有 txt 文件都已导入 df 并使用此代码分配它们的名称txt_files &lt;- list.files(pattern = "*.txt") for(i in txt_files) { x &lt;- read.delim(i, header=TRUE) assign(i,x) }我应该如何替换read.table(myFile[i], h=T)
  • 酷,我很高兴 :)
  • @GyB 我意识到它们是一个小问题,因为所有数据都是从第 1 到第 7 个数据帧中正确提取的,它不是 [1] 7896558077 6983744285 7306744576 8428045883 9298350108 10169081810 450 [8] 428 404 380 339 312 291 343 [15] 386 404 490 399 409 446 440 [22] 434 377 381 413 366 393 etc... 可能是因为前 7 个类型是“数字”,其余的“因素”,你知道我该如何解决吗?
  • 看起来您正在处理某些数据框中的因素。你声明了什么类型的 m_value ?
  • 如果还不是这样,可以将m_value声明为字符,然后将新值强制转换为字符:m_value[i] &lt;- as.character(get(txt_files[i])$Marknadsvarde_tot[1])
【解决方案2】:

您可以为此使用data.table-package 的fread 中的select-参数:

library(data.table)
file.list <- list.files(pattern = '.txt')
lapply(file.list, fread, select = 'Marknadsvarde_tot', nrow = 1, header = FALSE)

这将产生一个数据表/数据框列表。如果您只想要一个包含所有值的向量:

sapply(file.list, function(x) fread(x, select = 'Marknadsvarde_tot', nrow = 1, header = FALSE)[[1]])

【讨论】:

    【解决方案3】:
    temp = list.files(pattern="*.txt")
    library(data.table)
    list2env(
      lapply(setNames(temp, make.names(gsub("*.txt$", "", temp))), 
             fread), envir = .GlobalEnv)
    

    将 data.table 添加到Importing multiple .csv files into R 的现有答案中

    获得所有文件后,您可以使用 DT[i,j,k] 从 data.tables 中获取数据,其中 i 将成为您的条件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多