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