将字符串分成一个列表以删除重复项
Separating strings into one list to remove duplicates
我有一个很大的文本文件(50,000 行)我正在尝试从
中删除 duplicates/find 个独特的词
CSV 中的 rows/strings 有所不同,因此三行可能如下所示:
I like cars
Ford
Cars go fast
我想先将每个 row/string 分开,然后将它们组合起来,这样我就可以从上面得到以下列表:
I
like
cars
Ford
Cars
go
fast
列表完成后,更改每个单词的大小写然后删除重复项应该很容易,留下文档中所有单词的唯一列表。
有些行是段落,因此 Excel 无法完成这项工作。我猜 paste
和 paste(unique())
可能有用,但我无法使用 read.csv
以所需格式从文档中获取单词。
这些段落可能包含标点符号、数字和@等随机字符,因此可能需要先转换字符串。
编辑:
3 种方法有效,但结果不同,这里是 link 到 csv,任何关于为什么结果不同的见解都将不胜感激。
假设您将原始数据读入如下所示的数据框中:
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
为了拆分字符串,请看这里:
"How to Split Strings in 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, " "))
所以结果中不会再有重复项了。
我们可以使用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+"))))
或使用 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
为了方便起见,我会使用 stringr 包将所有单词放入一个字符向量中,如下所示:
tempdata <- read.csv("temp.csv",sep=",",skip=-1,stringsAsFactors=FALSE,header=FALSE)
library(stringr)
listrows <- str_split(tempdata$V1,pattern=" ")
allwords <- unlist(listrows)
我有一个很大的文本文件(50,000 行)我正在尝试从
中删除 duplicates/find 个独特的词CSV 中的 rows/strings 有所不同,因此三行可能如下所示:
I like cars
Ford
Cars go fast
我想先将每个 row/string 分开,然后将它们组合起来,这样我就可以从上面得到以下列表:
I
like
cars
Ford
Cars
go
fast
列表完成后,更改每个单词的大小写然后删除重复项应该很容易,留下文档中所有单词的唯一列表。
有些行是段落,因此 Excel 无法完成这项工作。我猜 paste
和 paste(unique())
可能有用,但我无法使用 read.csv
以所需格式从文档中获取单词。
这些段落可能包含标点符号、数字和@等随机字符,因此可能需要先转换字符串。
编辑:
3 种方法有效,但结果不同,这里是 link 到 csv,任何关于为什么结果不同的见解都将不胜感激。
假设您将原始数据读入如下所示的数据框中:
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
为了拆分字符串,请看这里:
"How to Split Strings in 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, " "))
所以结果中不会再有重复项了。
我们可以使用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+"))))
或使用 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
为了方便起见,我会使用 stringr 包将所有单词放入一个字符向量中,如下所示:
tempdata <- read.csv("temp.csv",sep=",",skip=-1,stringsAsFactors=FALSE,header=FALSE)
library(stringr)
listrows <- str_split(tempdata$V1,pattern=" ")
allwords <- unlist(listrows)