Birden çok dizenin başka bir dize listesinde gruba göre görünme sayısını nasıl sayabilirim?

0

Soru

Şimdi iki veriye sahibim, ad ve metin ve metindeki geçerli yıldaki addaki her adın oluşum sayısını hesaplamak, yani veri sonucu oluşturmak istiyorum. Bunu başarmak için nasıl? Lapply ve grepl'i denedim ama ikisi de başarısız oldu. Çok teşekkürler!

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

En iyi cevabı

2

Listelenmemiş değerler üzerinde bir birleştirme çalışacaktır:

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

Bu ign değişken, zorlayabilmemiz için all.x=TRUE yine de bulunmayanları hesaba katın. y.


Daha yavaş ama belki de daha fazla bellek tutumlu yöntem:

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

Teşekkür ederim. Kodunuzu denedim ve örnekte sorun yok, ancak gerçek verilerim çok büyük ve satırlar text 100 milyondan fazla var, bu yüzden R Hata bildiriyor: bellek tükendi (sınıra ulaşıldı mı?). Bu sorunu nasıl çözeceğinizi biliyor musunuz?
Vesper

Düzenlememin bunu yapmanın bir yolunu sunup sunmadığına bakın. Daha yavaş olacak (çok uzak değil) for döngü) ancak belleğe daha az genişler.
r2evans

Çok teşekkürler! Sorun çözüldü.
Vesper

Diğer dillerde

Bu sayfa diğer dillerde

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