Comment compter le nombre de multiples chaînes apparaissent dans une autre chaîne de la liste par groupe?

0

La question

Maintenant, j'ai deux données, le nom et le texte, et je veux calculer le nombre d'occurrences de chaque nom dans nom dans l'année en cours dans le texte, qui est, pour générer des données de résultat. Comment atteindre cet objectif? J'ai essayé lapply et grepl, mais les deux ont échoué. Merci beaucoup!

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

La meilleure réponse

2

Une fusion sur non cotées en bourse des valeurs de travail:

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

L' ign la variable est alors que nous pouvons forcer all.x=TRUE mais pour ceux qui n'ont pas été trouvés dans y.


Plus lent mais peut-être plus de mémoire frugal méthode:

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

Je vous remercie. J'ai essayé ton code et il n'y a pas de problème dans l'exemple, mais mes données réelles est très grande, et les lignes de text sont plus de 100 millions de dollars, afin de R les rapports d'Erreur: mémoire épuisée (limite atteinte?). Savez-vous comment résoudre ce problème?
Vesper

Voir si mon edit offre un moyen de le faire. Ça va être plus lent (c'est pas loin d'un for la boucle), mais se développe de moins en moins dans la mémoire.
r2evans

Merci beaucoup! Le problème a été résolu.
Vesper

Dans d'autres langues

Cette page est dans d'autres langues

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