R-在文本中工作

时间:2015-07-12 20:54:44

标签: r text

我的表格中包含以下文字:

tt<-data.frame(a=c("esta es la unica lista que voy a hacer","esta es la 2da unica"))

我只需要保留超过3个字符的单词:

tt<-data.frame(a=c("esta unica lista hacer","esta unica"))

在这种情况下,我不知道该怎么做。我知道我必须在表格上使用nchar和一个循环,并在单词的另一个循环内部。

4 个答案:

答案 0 :(得分:3)

如果你把它分成块,这不是太棘手。首先使用apply迭代数据框的每一行。然后对于每一行,将字符串分解为单词,选择长字符串,粘贴回字符串,然后返回结果:

tt<-data.frame(a=c("esta es la unica lista que voy a hacer","esta es la 2da unica"))
library(stringr)

tt$a <- lapply(tt$a, function(x) {
  l <- unlist(str_split(x, " "))
  t <- l[which(nchar(l)>3)]
  return(paste0(t, collapse=" "))
})

答案 1 :(得分:3)

使用data.table包:

library(data.table)
setDT(tt)
tt[,a:=gsub("\\s+"," ",gsub("\\b\\w{1,3}\\b","",a))]

                        a
1: esta unica lista hacer
2:             esta unica

另一个选项,取决于您想要的输出,是:

library(data.table)  #1.9.5+
tt[,tstrsplit(gsub("\\b\\w{1,3}\\b","",a),split="\\s+")]

     V1    V2    V3    V4
1: esta unica lista hacer
2: esta unica    NA    NA

编辑:在@rawr的鼓励下经过多次争吵之后,这是一种更直接地解决问题的方法(包括4个字母的单词而不是排除3个字母的单词)

tt[,a:=lapply(regmatches(a, gregexpr('\\b\\w{4,}\\b',a)),paste0,collapse=" ")]

答案 2 :(得分:2)

这是另一种使用 qdapRegex 包的方法。

library(qdapRegex)

tt <- data.frame(a = c('esta es la unica lista que voy a hacer', 'esta es la 2da unica'))
tt$a <- rm_nchar_words(tt$a, 1, pattern = '\\b\\w{1,3}\\b')
tt

#                        a
# 1 esta unica lista hacer
# 2             esta unica

答案 3 :(得分:1)

这是一个使用 quanteda 包的解决方案,它会对data.frame中的文本进行标记,并删除长度为&lt; = 3的标记。请注意,我已指定{{1 stringsAsFactors = FALSE中的这里 - 如果您直接在字符向量上操作,这将同样适用。

data.frame()

如果您想要原始文本而不是标记化版本,请使用以下附加步骤:

require(quanteda)
tt <- data.frame(a=c("esta es la unica lista que voy a hacer", "esta es la 2da unica"),
                 stringsAsFactors = FALSE)
ttTokenized <- tokenize(tt$a)
(ttTokenized <- sapply(ttTokenized, function(x) x[nchar(x) > 3]))
## [[1]]
## [1] "esta"  "unica" "lista" "hacer"
## 
## [[2]]
## [1] "esta"  "unica"