Tenho dois conjuntos de dados:
O primeiro data frame ( small
) é relativamente menor que o segundo data frame ( large
). Cada data frame tem uma id
coluna com identificadores exclusivos. O data frame menor tem uma coluna de lista chamada links
, que contém uma lista de links para o segundo data frame maior. O data frame maior tem uma coluna de atributos, que chamaremos de att
:
library(tidyverse)
a <- c(3, 3, NA, 5)
b <- c(NA, 3, 4, 5)
small <- tibble(id = c(1, 2),
links = list(a, b))
large <- tibble(id = c(3, 4, 5),
att = c("yes", "no", "maybe"))
Meu objetivo é contar o número de vezes que cada observação no small
quadro de dados tem links para observações com o "yes"
atributo no large
quadro de dados.
Sinto que algo assim está no caminho certo, mas não está contando corretamente:
counted <- small %>%
mutate(count_yes = map_int(links, ~ sum(large$att[large$id %in% .x] == "yes")))
print(counted)
#> # A tibble: 2 × 3
#> id links count_yes
#> <dbl> <list> <int>
#> 1 1 <dbl [4]> 1
#> 2 2 <dbl [4]> 1
Aqui, count_yes
aparece apenas como 1, quando deveria ser lido como 2 e 1.
Você está no caminho certo, mas precisa de alguns ajustes.
Ou na base R:
Observe o uso de
%in%
em vez de==
retornariaFALSE
paraNA
valores.Como você está procurando uma solução tidyverse , acho que uma maneira expressiva aqui é na
tidyr::unnest()
coluna da lista aqui, depoisleft_join()
emlarge
esummarise()
:Embora eu prefira manter os dados em formato longo em vez de fazer a última etapa, a menos que haja um bom motivo para trabalhar com colunas de lista, pois isso evitará a necessidade de iterar sobre uma coluna com funções
map*()
ou*apply()
.