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.

Divida una columna de cadenas (con diferentes patrones) en función de dos condiciones diferentes.

Estaba esperando obtener ayuda con este problema. Tengo una columna con dos tipos de cadenas y necesitaría dividir las cadenas en varias columnas usando 2 condiciones diferentes. Puedo averiguar cómo dividirlas individualmente, pero tengo problemas para agregar tal vez una declaración IF a mi código. Este es el conjunto de datos de ejemplo a continuación:

data = data.frame(string=c("HFUFN-087836_661", "207465-125 - IK_6 Mar 2009.docx_37484956"))

Para el primer tipo de variable (con el subrayado). Me gustaría dividir después del _. Entonces utilicé el siguiente código para eso:

strsplit(data$string, "-")

Para las variables que tienen .docx en ellas, me gustaría dividir después de docx. No puedo dividir en función de “<” ya que aparece varias veces en esta cadena. Así que usé el siguiente código:

strsplit(data$string, "x_")

Mi pregunta es que ambos tipos de cadenas aparecen en la misma columna. ¿Hay alguna manera de decirle a R si hay “docx” en la cadena, dividir después de x_, pero si no, dividir en _?

Cualquier ayuda sería apreciada. ¡Gracias chicos!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr esta tarea, puedes usar una declaración if dentro de la función strsplit. Aquí hay un ejemplo de código:

    # crear un nuevo data frame vacío
    new_data <- data.frame(matrix(ncol = 3, nrow = nrow(data)))
    
    # recorrer cada fila del data frame
    for (i in 1:nrow(data)) {
    
      # verificar si "docx" está en la cadena
      if ("docx" %in% data$string[i]) {
    
        # dividir después de "x_"
        new_cols <- unlist(strsplit(data$string[i], "x_"))
    
      } else {
    
        # dividir después de "_"
        new_cols <- unlist(strsplit(data$string[i], "_"))
    
      }
    
      # asignar los nuevos valores al nuevo data frame
      new_data[i, ] <- new_cols
    
    }
    
    # asignar nombres de columna al nuevo data frame
    colnames(new_data) <- c("columna_1", "columna_2", "columna_3")
    
    # combinar el nuevo data frame con el data frame original
    final_data <- cbind(data, new_data)
    

    Este código crea un nuevo data frame con columnas vacías y usa un bucle for para verificar cada fila del data frame original. Si “docx” está en la cadena, se divide después de “x_”, de lo contrario, se divide después de “_”. Luego se asignan los nuevos valores al nuevo data frame y también se asignan los nombres de columna. Finalmente, el código combina el nuevo data frame con el data frame original para obtener la salida deseada.

    ¡Espero que esto ayude!

Comments are closed.