【问题标题】:Separating strings into one list to remove duplicates将字符串分成一个列表以删除重复项
【发布时间】:2016-05-17 13:21:23
【问题描述】:

我有一个大文本文件(50,000 行)我正在尝试从中删除重复项/查找唯一词

CSV 中的行/字符串各不相同,三行可能如下所示:

I like cars
Ford
Cars go fast

我想先将每一行/字符串分开,然后将它们组合起来,这样我就可以从上面得到以下列表:

I
like
cars
Ford
Cars
go 
fast

该列表完成后,应该很容易更改每个单词的大小写,然后删除重复项,留下文档中所有单词的唯一列表。

有些行是段落,因此 Excel 无法处理这项工作。我猜pastepaste(unique()) 可能有用,但我无法使用read.csv 从文档中获取所需格式的单词。

这些段落可能包含标点符号、数字和@等随机字符,因此可能需要先转换字符串。

编辑:

3 种有效的方法,但结果不同,这里是 csv 的链接,任何关于为什么结果不同的见解将不胜感激。

https://onedrive.live.com/redir?resid=61FAC513EBF4A4B9!296&authkey=!AMsiIuW4lCD_qrs&ithint=file%2ccsv

【问题讨论】:

  • 您可以执行unlist(strsplit(x, " ", fixed = TRUE)) 之类的操作(可能需要在两者之间进行as.character 转换。尽管dput 的数据可能也很有帮助。
  • 我已经设法获得一个包含 25000 个变量的表(其中每个变量是一个可以是单词或段落的字符串)或包含 62 个变量的 530000 个 obs 的表,其中 62是任何段落中最多的单词数(由空格分隔)。

标签: r string list duplicates read.csv


【解决方案1】:

我们可以使用scan

df1 <- data.frame(words= unique(scan(text=as.character(df$s), what="", sep=" ")))
df1
#  words
#1     I
#2  like
#3  cars
#4  Ford
#5  Cars
#6    go
#7  fast

或者更快的方法是

library(stringi)
data.frame(words = unique(unlist(stri_extract_all(df$s, regex="\\S+"))))

【讨论】:

  • textConnection(text, encoding = "UTF-8") 中的错误:'text' 参数无效
  • @OliPaul 我没有收到任何错误。但是,我还提供了另一种方法str_extract_all
  • 我会尝试的 - 我没有提到每个字符串中可能还有其他字符,例如 @ 以及数字和标点符号。
  • @OliPaul 也许你可以在我更新帖子时使用\\S+ 而不是\\w+
  • 128000 obs 的 1 个变量。我相信使用视图,这已经奏效了。谢谢!
【解决方案2】:

假设您将原始数据读入如下所示的数据框中:

df <- data.frame(s = c('I like cars', 'Ford', 'Cars go fast'), stringsAsFactors = FALSE)
df
             s
1  I like cars
2         Ford
3 Cars go fast

您可以按如下方式创建新的结果数据框:

newdf <- data.frame(words = unlist(strsplit(df$s, ' ')))
newdf
  words
1     I
2  like
3  cars
4  Ford
5  Cars
6    go
7  fast

【讨论】:

  • dfv1$x 是 1 个变量的 25000 obs。使用上面我得到: strsplit(dfv1$x, " ") 中的错误:非字符参数
  • 你能查一下str(dfv1)吗?它需要字符类。你读过stringsAsFactors = FALSE吗?
  • 'data.frame':25605 obs。 1 个变量:$ x:因子 w/ 20136 级别“'并排'我做了:dfv1=data.frame(x=vac2$VAC_DSCRPN, stringsAsFactors = FALSE)
  • 所以...x 是一个因素。使用as.character()将其转换为字符。
  • df2
【解决方案3】:

或者使用splitstackshape中的cSplit()

library(splitstackshape)
cSplit(df, 1, sep = " ", direction = "long")

#     V1
#1:    I
#2: like
#3: cars
#4: Ford
#5: Cars
#6:   go
#7: fast

【讨论】:

  • 我做了 d2
  • 难以解决使用您的示例无法重现的问题。
  • stringr 方法返回 213000 个结果。这些数据是公开的,所以我实际上可以上传 csv - 我习惯于敏感数据,但这是公开的
  • 好像处理空间的方式不同
【解决方案4】:

为了方便起见,我会将所有单词放入一个字符向量中,使用 stringr 包,如下所示:

tempdata <- read.csv("temp.csv",sep=",",skip=-1,stringsAsFactors=FALSE,header=FALSE)

library(stringr)

listrows <- str_split(tempdata$V1,pattern=" ")
allwords <- unlist(listrows)

【讨论】:

  • 然后执行 data.frame(unique(allwords)) 并获得 213000 个结果。这也有效,但是所有三种方法都返回不同的结果。谢谢
【解决方案5】:

为了拆分字符串,请看这里:

“如何在 R 中拆分字符串” 作者:R For Dummies 的 Andrie de Vries 和 Joris Meys http://www.dummies.com/how-to/content/how-to-split-strings-in-r.html

要在单词边界(空格)处拆分此文本,可以使用 strsplit(),如下所示:

strsplit(yourtext, " ")    # Split using spaces as boundaries

要查找列表中的唯一元素,可以使用 unique() 函数:

unique(strsplit(yourtext, " "))

所以结果中不会再有重复了。

【讨论】:

  • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
猜你喜欢
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2014-09-16
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多