Cómo contar el número de múltiples cadenas aparecen en otra cadena de lista por grupo?

0

Pregunta

Ahora tengo dos datos, nombre y texto, y quiero calcular el número de apariciones de cada nombre de nombre en el año actual en el texto, es decir, para generar los datos de resultado. Cómo lograr esto? Traté de lapply y grepl, pero ambos fracasaron. Muchas gracias!

name=data.table(year=c(2018,2019,2020),
                  name0=list(c("A","B","C"),c("B","C"),c("D","E","F")))
text=data.table(year=c(2018,2018,2019,2019,2020),
                text0=list(c("DEF","BG","CG"),c("ART","CWW"),c("DLK","BU","FO"),
                           c("A45","11B","C23"),c("EIU","CM")))
result=data.table(year=c(2018,2018,2018,2019,2019,2020,2020,2020),
                 name0=c("A","B","C","B","C","D","E","F"),
                 count=c(1,1,2,2,1,0,1,0))
data.table grepl lapply r
2021-11-23 15:24:57
1

Mejor respuesta

2

Una combinación de valores no cotizados funcionará:

library(data.table)
merge(
  name[, .(name0 = unlist(name0)), by = .(year)],
  text[, .(name0 = unlist(strsplit(unlist(text0), ""))), by=.(year)][, ign := 1],
  by = c("year", "name0"), all.x = TRUE, allow.cartesian = TRUE
)[,.(count = sum(!is.na(ign))), by = .(year, name0)]
#     year  name0 count
#    <num> <char> <int>
# 1:  2018      A     1
# 2:  2018      B     1
# 3:  2018      C     2
# 4:  2019      B     2
# 5:  2019      C     1
# 6:  2020      D     0
# 7:  2020      E     1
# 8:  2020      F     0

El ign variable es así que podemos forzar all.x=TRUE sin embargo, para aquellas que no se encontraban en y.


Más lento, pero tal vez la memoria con más frugal método:

namelong <- name[, .(name0 = unlist(name0)), by = .(year)]
namelong
#     year  name0
#    <num> <char>
# 1:  2018      A
# 2:  2018      B
# 3:  2018      C
# 4:  2019      B
# 5:  2019      C
# 6:  2020      D
# 7:  2020      E
# 8:  2020      F

func <- function(yr, nm) text[year == yr, sum(grepl(nm, unlist(text0)))]
namelong[, count := do.call(mapply, c(list(FUN=func), unname(namelong)))]
#     year  name0 count
#    <num> <char> <int>
# 1:  2018      A     1
# 2:  2018      B     1
# 3:  2018      C     2
# 4:  2019      B     2
# 5:  2019      C     1
# 6:  2020      D     0
# 7:  2020      E     1
# 8:  2020      F     0
2021-11-23 18:51:35

Gracias. He probado tu código y no hay ningún problema en el ejemplo, pero mis datos reales es muy grande, y las filas de text son más de 100 millones de dólares, por lo que R informes de Error: memoria agotado (se ha alcanzado el límite?). ¿Sabes cómo resolver este problema?
Vesper

A ver si mi edición ofrece una manera de hacerlo. Va a ser más lento (no muy lejos de un for loop), sino que se expande menos en la memoria.
r2evans

Muchas gracias! El problema fue resuelto.
Vesper

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................