Jak spočítat počet více řetězců objeví v jiném řetězci seznam podle skupiny?

0

Otázka

Teď mám dva údaje, název a text, a chci vypočítat počet výskytů každého jména v názvu v letošním roce v textu, který je, jak generovat data výsledek. Jak toho dosáhnout? Snažil jsem se lapply a grepl, ale oba zklamali. Díky moc!

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

Nejlepší odpověď

2

Sloučení na neveřejné hodnoty bude fungovat:

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

Na ign variabilní je tak, že můžeme síla all.x=TRUE přesto účtu pro ty, které nebyly nalezeny v y.


Pomalejší, ale možná více paměti-skromný způsob:

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

Děkuji. Snažil jsem se svůj kód a není žádný problém v příkladu, ale moje skutečná data, je velmi velký, a řádky text jsou více než 100 milionů, takže R zprávy Error: memory exhausted (dosáhl limitu?). Víte, jak tento problém vyřešit?
Vesper

Uvidíme, jestli mou editaci nabízí způsob, jak to udělat. To bude pomalejší (není to daleko od for smyčky), ale rozšiřuje méně do paměti.
r2evans

Děkuji moc!!! Problém byl vyřešen.
Vesper

V jiných jazycích

Tato stránka je v jiných jazycích

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