【问题标题】:Multiple text into dataframe in R多个文本进入R中的数据框
【发布时间】:2020-11-10 21:06:55
【问题描述】:

我有 50 个 txt 文件,都包含多个这样的单词

View(file1.txt)
one
two
three
four
cuatro

View(file2)
uno
five
seis
dos

每个文件只有一行单词,长度不同。 我想在 R 中创建一个数据框,将每个文件的内容放入一列,列名是文件名。

   file1    file2  ...........etc
1  one      uno
2  two      five
3  three    seis
4  four     dos
5  cuatro   

到目前为止,我已将所有文件加载到这样的列表中:

files<- lapply(list.files(pattern = "\\.txt$"),read.csv,header=F) 
> class(files)
[1] "list"
df <- data.frame(matrix(unlist(files), ncol= length(files)))

这绝对是接近但错误的,因为没有漏洞(并且某些列应该比其他列有更多的数据)并且它也不会自动命名列。 希望有人能帮忙!

【问题讨论】:

  • 所有文件的列名都相同吗?
  • @Onyambu 他们没有列名,请参阅“header = F”

标签: r dataframe


【解决方案1】:

试试这个,获取文件名,读入它们,获取最大行数,然后扩展行数。最后,转换成data.frame:

f <- list.files(pattern = "\\.txt$", full.names = TRUE)
names(f) <- tools::file_path_sans_ext(basename(f))

res <- lapply(f, read.table)

maxRow <- max(sapply(res, nrow))

data.frame(lapply(res, function(i) i[seq(maxRow), ]))

#    file1 file2
# 1    one   uno
# 2    two  five
# 3  three  seis
# 4   four   dos
# 5 cuatro  <NA>

【讨论】:

  • 太好了,可以通过使用sapplyreadLines 直接读取这些代码(最后一行中的-1line 和-code)来进一步减少这些代码,从而生成一个命名列表,创建数据.frame 使用data.frame(sapply(files, "[", 1:max_len))
  • @CainãMaxCouto-Silva 谢谢,我更喜欢清晰的分步解决方案,这不是code golf
【解决方案2】:

这个想法是获取具有最大长度的文件,并使用该长度来完成其他(长度更少)填充NA,以便可以使用多个向量。
您可以通过不同的方法实现这一目标。这是一种方法。

files <- sapply(list.files(pattern = "\\.txt$"), readLines)
max_len <- max(sapply(files_data, length))

df <- data.frame(sapply(seq_along(files), function(i) {
  len <- length(files[[i]])
  if(len < max_len) {
    files[[i]] <- append(files[[i]], rep(NA, max_len - len))
  } else {
    files[[i]]
  }
}))

names(df) <- basename(tools::file_path_sans_ext(names(files)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多