如何删除多余的|加载时从行中分离(管道)分隔符| (管道)分隔成R的文字

时间:2018-11-15 01:48:12

标签: r

我正在从文件中读取文本,该文件中的文本用|分隔。 (烟斗)。

文本表如下所示(tweet id |日期和时间| tweet):

545253503963516928|Wed Dec 17 16:25:40 +0000 2014|Massachusetts Pharmacy Owners Arrested in Meningitis Deaths http://xxxxxxxxx
545235402156937217|Wed Dec 17 15:13:44 +0000 2014|For First Time, Treatment Helps Patients With Worst Kind of Stroke, Study Says http://xxxxxxxxx

我正在使用以下代码读取此信息:

nyt  <- read.table(file=".../nytimeshealth.txt", 
                                      sep="|", 
                                      header = F, 
                                      quote="", 
                                      fill=T, 
                                      stringsAsFactors = F,
                                      numerals ="no.loss",
                                      encoding = "UTF-8",
                                      na.strings = "NA")

现在,虽然原始文件中的大多数行都有3列,每行之间都用'|'分隔,但少数行中还有一个附加的'|'分隔器。也就是说,它们有四列,因为某些推文本身包含|符号。

545074589374881792|Wed Dec 17 04:34:43 +0000 2014|National Briefing | New England: Massachusetts: Sex-Change Surgery Denied to Inmate http://xxxxxxxxx

我知道在上述fill=T函数中使用read.table选项可以读取不等长的行(空白字段隐式添加到空单元格中)。

因此,上面的行变为

71 545074589374881792 Wed Dec 17 04:34:43 +0000 2014 National Briefing
72 New England: Massachusetts: Sex-Change Surgery Denied to Inmate http://xxxxxxxxx

但是,现在第71行的第3列具有不完整的信息,而第72行的第2列和第3列为空,而第1列不包含推文ID,而是一部分推文。有什么办法可以避免这种情况吗?我想删除多余的|分隔符,以免丢失任何信息。

在将文本文件读入R时可以这样做吗?还是在开始加载文本之前我必须要照顾的事情。我最好的做法是什么?

2 个答案:

答案 0 :(得分:2)

我创建了一个名为text.txt的文本文件,其中提供了3行作为数据示例(推文中2条简单行中没有任何|以及包含{{ 1}}中)。

这是此文件的内容:

|

代码

545253503963516928|Wed Dec 17 16:25:40 +0000 2014|Massachusetts Pharmacy Owners Arrested in Meningitis Deaths http://xxxxxxxxx
545235402156937217|Wed Dec 17 15:13:44 +0000 2014|For First Time, Treatment Helps Patients With Worst Kind of Stroke, Study Says http://xxxxxxxxx
545074589374881792|Wed Dec 17 04:34:43 +0000 2014|National Briefing | New England: Massachusetts: Sex-Change Surgery Denied to Inmate http://xxxxxxxxx

结果

library(tidyverse)

readLines("text.txt", encoding = "UTF-8") %>%
  map(., str_split_fixed, "\\|", 3) %>%
  map_df(., as_tibble)

答案 1 :(得分:0)

这是另一个解决方案,可以返回您的评论并使用您的初始代码。但是,只有在每个推文中有一个|的情况下,此解决方案才有效(您可以拥有不包含任何推文的推文,只要至少一条推文中有一个|)。如果您的推文中没有任何|,或者某些推文中有多个|,则它将中断并且您必须对其进行编辑。因此,不管您的推文的结构如何,另一个答案都将是更好的IMO。

我仍在使用text.txt文件:

df <- read.table(file = "text.txt", 
                 sep = "|", 
                 header = F, 
                 quote = "", 
                 fill = T, 
                 stringsAsFactors = F,
                 numerals = "no.loss",
                 encoding = "UTF-8",
                 na.strings = "NA")

df %>%
  mutate(V3 = paste0(V3, V4)) %>%
  select(- V4)

结果

                  V1                             V2
1 545253503963516928 Wed Dec 17 16:25:40 +0000 2014
2 545235402156937217 Wed Dec 17 15:13:44 +0000 2014
3 545074589374881792 Wed Dec 17 04:34:43 +0000 2014
                                                                                                    V3
1 Massachusetts Pharmacy Owners Arrested in Meningitis Deaths http://xxxxxxxxx 
2 For First Time, Treatment Helps Patients With Worst Kind of Stroke, Study Says http://xxxxxxxxx 
3 National Briefing  New England: Massachusetts: Sex-Change Surgery Denied to Inmate http://xxxxxxxxx