将多个txt文件加载到单个数据框中,并将名称保留为R中的列

时间:2014-10-19 13:12:17

标签: r dataframe

我是R的新手,我正在尝试将名称,频率和性别三列的100个左右的txt文件加载到一个数据框中。这些文件都是名称“yob1990.txt”等。

我可以将所有文件都放到R中,但我不知道如何添加一年只有一年的专栏..有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

我会使用类似这样的工作流程,它假定(1)指定路径中的唯一.txt文件是您想要读入的文件,以及(2)文件名中的唯一数字是这些年份的数字。

f <- list.files('path/to/files', patt='\\.txt$', full.names=TRUE) 
# replace path above as required
d <- do.call(rbind, lapply(f, function(x) {
  d <- read.table(x, header=TRUE) # add sep argument as required
  d$Year <- as.numeric(gsub('\\D', '', basename(x)))
  d
}))

f将是您需要阅读的文件的完整路径向量。

lapply依次考虑每个文件名(f的每个元素),暂时将该文件名称为x,并执行花括号之间的所有内容。

gsub('\\D', '', basename(x))basename(x)执行“查找和替换”类型的操作(这是当前考虑的文件的文件名,不包括包含该文件的目录的结构)。我们查找所有非数字字符('\\D'),并将其替换为空('')。我们将此gsub操作的结果(即假设文件名中没有其他数字的年份)添加到data.frame的新Year列。

最后,我们返回d,一旦lapplyf中的所有文件执行了此过程,我们就会将它们与do.call(rbind, ...)一起绑定。

答案 1 :(得分:1)

您还可以使用fread中的rbindlistdata.table。如果文件在工作目录中,

  f1 <- list.files(pattern="^yob.*\\.txt")
  f1  #created 3 files
  #[1] "yob1990.txt" "yob1991.txt" "yob1992.txt"

  library(data.table)
  library(stringr)
  year <- as.numeric(str_extract(f1, perl("[0-9]+(?=\\.txt)")))
  res <- rbindlist(Map(`cbind`, lapply(f1, fread), year=year))

  head(res)
 #    Name Frequency Gender year
 #1:   Sam        24   Male 1990
 #2:  Gobi        22   Male 1990
 #3:  Rose        44 Female 1990
 #4: Anita        35 Female 1990
 #5:  John        44   Male 1991
 #6: Sofia        52 Female 1991

或者您可以使用unnest

中的tidyr
  devtools::install_github("hadley/tidyr")
  library(tidyr)
  res1 <- unnest(setNames(lapply(f1, fread), year), year)
  head(res1)
  #  year  Name Frequency Gender
  #1 1990   Sam        24   Male
  #2 1990  Gobi        22   Male
  #3 1990  Rose        44 Female
  #4 1990 Anita        35 Female
  #5 1991  John        44   Male
  #6 1991 Sofia        52 Female