2015-07-12 2 views
0

У меня есть таблица с текстом, как:R- работа внутри текста

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 и цикл над таблицей и внутри другого цикла над словами.

+1

'тт [] <- GSUB ('\\ Ь \\ ш {1 , 3} \\ s ',' ', tt $ a) ' – rawr

ответ

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 

Edit: После того, как много tussling на поощрение из @rawr, вот способ более непосредственно решить проблему (включить 4-буквенные слова вместо исключения 3-буквы w ords)

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

вам понадобится только один gsub' tt [, a: = gsub ('\\ b \\ w {1,3} \\ s', '', a)] ' – rawr

+0

@rawr о том, что строка '' long words excepting end'' – MichaelChirico

+0

Я не мог понять, как учесть оба случая в одном 'gsub', я уверен, что есть один, хотя – MichaelChirico

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=" ")) 
}) 
+0

почти, мне нужно сохранить тот же формат, кадр данных. – GabyLP

+0

Вы можете назначить результат столбцу фрейма данных, как показано в новом редактировании. – jkeirstead

+0

Я получаю этот результат: [1] «esta unica lista hacer» «esta unica» – GabyLP

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 
1

Вот решение, используя quanteda пакет , что размечает тексты на вашем data.frame и удаляет маркеры, длина которых < = 3. Обратите внимание, что я указал 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" 

Если вы хотите оригинальный вид текста, а не tokenised версии, а затем использовать этот дополнительный шаг:

sapply(ttTokenized, paste, collapse = " ") 
## [1] "esta unica lista hacer" "esta unica" 
Смежные вопросы