我的表格中包含以下文字:
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和一个循环,并在单词的另一个循环内部。
答案 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"