У меня есть dataframe с 1,8 миллионами строк, и каждая строка содержит один или несколько из 30 000 тегов. Я пытаюсь найти, сколько строк содержит экземпляр каждого тега. Некоторые элементы содержат до 25 тегов, каждый из которых находится в своем столбце. Ни в одной строке не содержит более одного экземпляра любого тега:Оптимизация запроса типа sumif в R
ItemNo <- c(1, 2, 3, 4)
Tag1 <- c("ZZZ", "AAA", "BBB", "YYY")
Tag2 <- c("YYY2", "ZZZ", "AAA", "XXX")
Tag3 <- c("", "YYY2", "AAA2", "XXX3")
Tag4 <- c("", "", "", "AAA")
Tag5 <- c("", "", "", "ZZZ")
Tag6 <- c("", "", "", "YYY2")
Items <- data.frame(ItemNo, Tag1, Tag2, Tag3, Tag4, Tag5, Tag6)
Items
ItemNo Tag1 Tag2 Tag3 Tag4 Tag5 Tag6
1 1 ZZZ YYY2
2 2 AAA ZZZ YYY2
3 3 BBB AAA AAA2
4 4 YYY XXX XXX3 AAA ZZZ YYY2
Вселенная тегов находится в отдельном наборе данных:
Code <- c("AAA", "BBB", "XXX", "ZZZ", "AAAA", "XXX3", "YYY2")
COUNT <- c(0, 0, 0, 0, 0, 0, 0)
tags <- data.frame(Code, COUNT)
tags
Code COUNT
1 AAA 0
2 BBB 0
3 XXX 0
4 ZZZ 0
5 AAAA 0
6 XXX3 0
7 YYY2 0
Я хочу, чтобы в конечном итоге с чем-то вроде этого:
Code COUNT
1 AAA 3
2 BBB 1
3 XXX 1
4 ZZZ 3
5 AAAA 0
6 XXX3 1
7 YYY2 3
Я могу получить хорошие результаты с помощью петли для обработки, которая занимает около 3 часов для прохождения через набор данных:
for (i in 1:nrow(tags)) {tags[i,2] <- sum(Items[,2:7] ==
as.character(tags[i,1]), na.rm = TRUE)}
Есть ли более эффективный или элегантный способ подсчета экземпляров каждого тега в этом наборе данных?
'table (unlist (tags [-1]))'. И конвертируйте все свои столбцы в 'character' * перед тем, как * запустить цикл. (или что-нибудь еще). Лучше всего это сделать, когда создается кадр данных ('stringsAsFactors = F'). Простое перемещение 'as.character()' вне цикла, вероятно, сбрит 30 минут вашего 3-часового времени работы. – Gregor