es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obteniendo las últimas 10 palabras de una cadena, aplicado en un vector de cadenas.

Tengo un vector de textos dentro de un dataframe (df1$text), y estoy tratando de crear un nuevo vector con las últimas 10 palabras del texto (df1$last.ten). He intentado lo siguiente sin éxito:

df1$last.ten = mapply(function(x,y) paste(word(x,y), collapse=" "), df1$text, -1:-10)

Pero en lugar de obtener una cadena de diez palabras, solo obtengo una palabra:

> df1$last.ten[1]
[1] "final."

Funciona correctamente cuando le proporciono una cadena de texto, por lo que parece que estoy utilizando mapply de manera incorrecta.

He intentado utilizar gsub para esto, pero no pude entender la sintaxis. Apreciaría una solución utilizando word() o gsub().

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay varias formas de lograr el resultado deseado, pero una posible solución utilizando el paquete stringr es:

    “`{r}
    library(stringr)
    df1$last.ten <- str_extract(df1$text, paste(rep(“\S+”, 10), collapse = “\s+(?=\S+$)”))


    Explicación: - `\\S+` coincide con cualquier secuencia de caracteres que no sean espacios (es decir, una palabra). - `rep("\\S+", 10)` crea un vector de 10 patrones de palabras. - `collapse = "\\s+(?=\\S+$)"` pega los patrones de palabras juntos con una búsqueda hacia adelante para asegurarse de que haya un carácter que no sea espacio después de la última palabra. Esto crea una expresión regular que coincide con las últimas 10 palabras en el texto. - `str_extract` extrae la primera coincidencia de la expresión regular en cada texto, devolviendo un vector de caracteres con la misma longitud que `df1$text`. Nota: - Si un texto tiene menos de 10 palabras, `str_extract` devolverá `NA`. Para manejar esto, puedes utilizar `str_extract_all` y modificar la expresión regular para que coincida con hasta 10 palabras en lugar de exactamente 10. ```{r} df1$last.ten <- sapply(str_extract_all(df1$text, paste(rep("\\S+", 10), collapse = "\\s+")), function(words) { if (length(words) < 10) return(NA) paste(words, collapse = " ") })

    Este código aplica str_extract_all a cada texto en df1$text, devolviendo una lista de vectores de caracteres. Luego, utiliza sapply para aplicar una función a cada vector de caracteres, que verifica si la longitud es menor que 10 y devuelve NA en ese caso, o une las palabras con un separador de espacio en caso contrario. Esto devuelve un vector de caracteres con la misma longitud que df1$text, con NA para los textos con menos de 10 palabras.

Comments are closed.