从多个文本文件创建一个 data.frame,行名称作为 r 中的列

Create a data.frame from multiple textfiles with rownames as columns in r

我是 r 的新手,我已经无法读取我的文件。

我有一个包含 1100 个 .txt 文件的列表。 前 4 行是元数据(“Newspaper”、“Date”、“Ressort”、“Title”) 正文从第五行开始。

问题 我没有完成 data.frame。我显示为我的第一个 .txt 文件的循环。

所以,这就是我试过的

我用 list.files() 在 r 中读取它们并写了一个 for-loop

datalist <- list.files()

for(i in datalist){
  test <- readLines(i, encoding = 'UTF-8')
}

第一个文件是 test-文件

test <- readLines(i, encoding = 'UTF-8')

test-文件给我元数据

meta <- test[1:4]

然后我将第 5 行定义为文本并删除换行符

text <- paste(test[5:length(test)], collapse = '')

然后我创建我的 data.frame 以元作为列和文本

df <- data.frame(datalist, Newspaper = meta[1], Date = meta[2], Resssort = meta[3], Text = text)
df

写为 csv - 当然

write.csv(df, "test.csv")

现在的问题是,我的列设置得很好,但在每一行中都出现了相同的数据,并且是来自 for 循环中测试的数据。 有任何想法吗? 如果能得到一些小费或答案,我将非常高兴和感激! 大家干杯

我不确定我是否遵循,但是你先做这个循环吗:

for(i in datalist){
  test <- readLines(i, encoding = 'UTF-8')
}

后跟这一行:

test <- readLines(i, encoding = 'UTF-8')

因为如果是这样,你正在重写 test,你将只会在你的测试变量中得到 datalist[i]。您之后所做的任何事情都只会从 datalist[I] 上的这个文件重新采样 - 这基本上应该是数据列表的最后一个文件。

如果不是,那么我不确定哪里出了问题,但如果您怀疑是 for 循环,您也可以这样做:

temp=paste('/completepathof/mapyourfilesarein',list.files(path='/completepathof/mapyourfilesarein'),sep='')
             
myfiles = lapply(temp, readLines,encoding = 'UTF-8')

这应该有效(我将它与 read.csv 一起使用,但不明白为什么它不能与 readLines 一起使用)。

此外,如果您想查明哪里出错了,请在 运行 一行之后使用命令 str(test) 或 str(df)(这样就是 str(无论您感兴趣的是什么))查看您是否意外更改了某些内容,以及是否以正确的方式读取/转换了列和数据。希望这对您有所帮助。

使用 {purrr}map_dfr 将文件名列表映射到(自定义)函数以读取数据的可能解决方案。这种解决方案的主要优点是您不必创建数据框列表 之后将它们合并在一起,通过避免循环,您不必创建会使工作环境混乱的临时对象。在函数内创建的所有对象仅存在于函数内。

缺点是一开始可能很难理解幕后发生的事情,而写for循环时,每一步都更加明确。如果您有时间,我鼓励您花时间观看 Hadley Wickham 的 The Joy of Functional Programming (for Data Science) 视频。在大约 8 分钟后,他谈到了您所面临的这类问题。但是整个视频都值得花时间! :)

library(tidyverse)
datalist <- list.files("data/newspaper", full.names = T)

custom_read_lines <- function(file) {
  # define function to read files and return a data frame already as expected
  # in final output
  whole_file <- readLines(file)
  text <- paste(whole_file[5:length(whole_file)], collapse = '')

  df <- data.frame(
    Newspaper  = whole_file[1],
    Date       = whole_file[2],
    Ressort    = whole_file[3],
    Title      = whole_file[4],
    Text       = text
  )

  return(df)
}

## using purrr's map_dfr to map each entry of data list to the custom function
df_merged <- datalist %>% map_dfr(custom_read_lines)

df_merged %>% as_tibble() #just for nicer output
# A tibble: 3 x 5
# Newspaper   Date      Ressort Title             text
# <chr>       <chr>     <chr>   <chr>             <chr>
# 1 Nice News   2021-01-… ressort Where does it co… "Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of …
# 2 Boring News 2020-11-… ressort Why do we use it? "It is a long established fact that a reader will be distracted by the readable content of a pa…
# 3 Old News    1990-01-… ressort What is Lorem Ip… "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has bee…



# in case your data looks a bit different and you want to try out first you can always try
# the function for a single file, if it works you can then pass it to the map_dfr function

first_file <- datalist[2]
custom_read_lines(first_file) %>% as_tibble()
# A tibble: 1 x 5
# Newspaper   Date      Ressort Title         text
# <chr>       <chr>     <chr>   <chr>         <chr>
#   1 Boring News 2020-11-… ressort Why do we us… It is a long established fact that a reader will be distracted by the readable content of a page wh…

3 个示例文件中的每一个都或多或少类似于以下内容:

Nice News
2021-01-01
ressort
Where does it come from?
Contrary to popular belief, Lorem Ipsum is not simply random text.
It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old.
Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source.