r split delimiter

R punto y coma delimitó una columna en filas



split delimiter (3)

Estoy usando RStudio 2.15.0 y he creado un objeto de Excel usando XLConnect con más de 3000 filas y 12 columnas. Estoy tratando de delimitar / dividir una columna en las filas, pero no sé si esto es posible o cómo hacerlo. Ejemplo de los datos a continuación utilizando las 3 columnas en conexión. cualquier ayuda en esto sería grandiosa.

El código que funciona para 2 de las columnas está debajo.

v1 <- with(df, tapply(PolId, Description, FUN= function(x) { x1 <- paste(x, collapse=";") gsub(''(//b//S+//b)(?=.*//b//1//b.*);'', '''', x1, perl=TRUE)})) library(stringr) Description <- rep(names(v1), str_count(v1, ''//w+'')) PolId <- scan(text=gsub('';+'', '' '', v1), what='''', quiet=TRUE) data.frame(PolId, Description)

Data de muestra

PolId Description Document.Type ABC123;ABC456;ABC789; TEST1 Pol1 ABC123;ABC456;ABC789; TEST1 Pol1 ABC123;ABC456;ABC789; TEST1 Pol1 AAA123; TEST1 End1 AAA123; TEST2 End2 ABB123;ABC123; TEST3 End1 ABB123;ABC123; TEST3 End1

Quiero que la salida sea así (reemplazando los Polid duplicados)

PolId Description Document.Type ABC123 TEST1 Pol1 ABC456 TEST1 Pol1 ABC789 TEST1 Pol1 AAA123 TEST1 End1 AAA123 TEST2 End2 ABB123 TEST3 End1 ABC123 TEST3 End1


Aquí hay una posible solución rápida de data.table

library(data.table) unique(setDT(df)[, .(PolId = unlist(strsplit(as.character(PolId), ";"))), by = Description]) # Description PolId # 1: TEST1 ABC123 # 2: TEST1 ABC456 # 3: TEST1 ABC789 # 4: TEST1 AAA123 # 5: TEST2 AAA123 # 6: TEST3 ABB123 # 7: TEST3 ABC123

Según su edición: otra opción (en caso de que tenga más de dos columnas)

library(splitstackshape) unique(cSplit(df, "PolId", ";", "long")) # PolId Description Document.Type # 1: ABC123 TEST1 Pol1 # 2: ABC456 TEST1 Pol1 # 3: ABC789 TEST1 Pol1 # 4: AAA123 TEST1 End1 # 5: AAA123 TEST2 End2 # 6: ABB123 TEST3 End1 # 7: ABC123 TEST3 End1


Aquí hay una solución base R. Divida el campo PolId usando strplit y para cada campo dividido c cúdelo con la Description correspondiente. Esto proporciona una lista de matrices que rbind . Finalmente establezca los nombres de las columnas.

out <- do.call(rbind, Map(cbind, strsplit(DF$PolId, ";"), DF$Description)) colnames(out) <- colnames(DF)

dando:

> out PolId Description [1,] "ABC123" "TEST1" [2,] "ABC456" "TEST1" [3,] "ABC789" "TEST1" [4,] "ABC123" "TEST1" [5,] "ABC456" "TEST1" [6,] "ABC789" "TEST1" [7,] "ABC123" "TEST1" [8,] "ABC456" "TEST1" [9,] "ABC789" "TEST1" [10,] "AAA123" "TEST1" [11,] "AAA123" "TEST2" [12,] "ABB123" "TEST3" [13,] "ABC123" "TEST3" [14,] "ABB123" "TEST3" [15,] "ABC123" "TEST3"

Nota: Usamos esto como entrada:

DF <- structure(list(PolId = c("ABC123;ABC456;ABC789;", "ABC123;ABC456;ABC789;", "ABC123;ABC456;ABC789;", "AAA123;", "AAA123;", "ABB123;ABC123;", "ABB123;ABC123;"), Description = c("TEST1", "TEST1", "TEST1", "TEST1", "TEST2", "TEST3", "TEST3")), .Names = c("PolId", "Description" ), class = "data.frame", row.names = c(NA, -7L))


Puede intentar unnest de tidyr después de dividir la columna "PolId" y obtener las filas unique

library(dplyr) library(tidyr) unnest(setNames(strsplit(df$PolId, '';''), df$Description), Description) %>% unique()

O usando la base R con stack/strsplit/duplicated . Divida el "PolId" ( strsplit ) entre el delimitador ( ; ), nombre los elementos de la lista de salida con la columna "Descripción", stack la lista para obtener un ''data.frame'' y use duplicated para eliminar las filas duplicadas.

df1 <- stack(setNames(strsplit(df$PolId, '';''), df$Description)) setNames(df1[!duplicated(df1),], names(df)) # PolId Description #1 ABC123 TEST1 #2 ABC456 TEST1 #3 ABC789 TEST1 #10 AAA123 TEST1 #11 AAA123 TEST2 #12 ABB123 TEST3 #13 ABC123 TEST3

U otra opción sin usar strsplit

v1 <- with(df, tapply(PolId, Description, FUN= function(x) { x1 <- paste(x, collapse=";") gsub(''(//b//S+//b)(?=.*//b//1//b.*);'', '''', x1, perl=TRUE)})) library(stringr) Description <- rep(names(v1), str_count(v1, ''//w+'')) PolId <- scan(text=gsub('';+'', '' '', v1), what='''', quiet=TRUE) data.frame(PolId, Description) # PolId Description #1 ABC123 TEST1 #2 ABC456 TEST1 #3 ABC789 TEST1 #4 AAA123 TEST1 #5 AAA123 TEST2 #6 ABB123 TEST3 #7 ABC123 TEST3