únicos valores unicos una todos tabla repetidos registros macro los lista fórmula extraer duplicados datos criterio con como buscar r search grep transpose

una - extraer valores unicos excel macro



Buscar valores únicos en el marco de datos y crear una tabla con ellos (2)

Desde que comencé a usar R <no hace mucho tiempo, este sitio me pareció muy útil para ayudarme a construir mis scripts. Una vez más me encontré con un desafío para el cual no puedo encontrar una respuesta en ningún lado. Aquí está mi problema: en mis datos tengo una columna que contiene una URL diferente en cada fila. En cada una de esas URL hay una información particular que quiero extraer. Actualmente lo hago en Excel porque me han dicho que es imposible hacerlo en R y que no existe ninguna función para hacerlo.

La URL se verá como este formato de ejemplo y se encontrará en la columna "fuente"

http://www.googleclick.com?utm_source=ADX&ID56789

http://www.googleclick.com?utm_source=ADW&ID56009

http://www.googleclick.com?utm_source=ADWords&ID53389

La parte de la URL que es de importancia para mí es el bit "utm_source = ADX". Mis datos se parecen a esto:

Usuario / Fuente

1 / http://www.googleclick.com?utm_source=ADX&ID56789

2 / http://www.googleclick.com?utm_source=ADW&ID56009

3 / http://www.googleclick.com?utm_source=ADWords&ID53389

Lo que necesito hacer es capturar el utm_source de la URL y transponer la información en una columna diferente, ejemplo a continuación:

Usuario / Fuente / utm_source

1 / googleclick / ADX y ID56789

2 / googleclick / ADW e ID56009

3 / googleclick / ADWords & ID53389

Entonces, en esencia, necesito que R busque en el marco de datos completo el valor "utm_source =" y una vez que los encuentre, quiero que transponga el valor "utm_source =" en un nombre de columna y copie toda la información que viene después "=" en una columna para cada fila individual. Sé que "grep" es una función que localiza una información específica en el archivo de datos, por ejemplo, datos <- total [grepl ("utm_source", total $ Source),]. Esto me dará todas las filas que contienen la palabra "utm_source", pero lo que necesito es la información que viene después de "utm_source". Por lo general, mis datos pueden tener hasta 500,000 filas. Por el momento, utilizo la función de Excel "texto a columnas" para esto, y básicamente divido las URL en pequeños fragmentos y conservo las columnas que necesito, pero esto puede ser un proceso muy complicado y prolongado.

¿Hay alguna forma de modificar la función grepl para cumplir los criterios que necesito?


La respuesta de @ Andrie hace el truco. Aquí hay otra manera de usar el uso de regmatches y gregexpr que podría ser útil.

d <- read.table(text="User URL 1 http://www.googleclick.com?utm_source=ADX&ID56789 2 http://www.googleclick.com?utm_source=ADW&ID56009 3 http://www.googleclick.com?utm_source=ADWords&ID53389", header=TRUE) domain.pat <- ''((?<=www.)([[:alnum:]_]+))'' source.pat <- ''((?<=utm_source=)([[:alnum:]&]+))'' # exclude the ''&'' here to only grab up to the ''&'' all.matches <- gregexpr(paste(domain.pat, source.pat, sep=''|''), d$URL, perl=TRUE) all.substrings <- regmatches(d$URL, all.matches) do.call(rbind, all.substrings) # [,1] [,2] # [1,] "googleclick" "ADX&ID56789" # [2,] "googleclick" "ADW&ID56009" # [3,] "googleclick" "ADWords&ID53389"


Nada es imposible.

x <- read.csv(text=" User, Source 1, http://www.googleclick.com?utm_source=ADX&ID56789 2, http://www.googleclick.com?utm_source=ADW&ID56009 3, http://www.googleclick.com?utm_source=ADWords&ID53389 ", header=TRUE, stringsAsFactors=FALSE)

Primero, use strsplit

strsplit(x$Source, split="//?utm_source=") [[1]] [1] " http://www.googleclick.com" "ADX&ID56789" [[2]] [1] " http://www.googleclick.com" "ADW&ID56009" [[3]] [1] " http://www.googleclick.com" "ADWords&ID53389"

Luego encuentra un atizador al rojo vivo y ponle el ojo a tu supuesto consejero.

EDITAR:

Según lo sugerido por Paul Hiemstra, también puede usar una expresión regular directamente:

gsub(".*//?utm_source=", "", x$Source) [1] "ADX&ID56789" "ADW&ID56009" "ADWords&ID53389"