Home > Enterprise >  Summing occurrences within a list of lists in R
Summing occurrences within a list of lists in R

Time:06-23

I am new to R.

I have a dataframe that contains variable sized lists. Please see output from dput(head()) at the end for specifics. I need to summarize the data based on the 'name' property. For example, the name "MicroPro #1" occurs 3 times below. I would like to produce a table of all names and the number of times each occurs in the data. Suggestions?


dput(head(temp))
list(structure(list(resource = structure(list(`_class` = c("resource", 
"resource"), oid = c(58742483L, 58744672L), name = c("MicroPro #1", 
"Speedlite Stand"), barcode = c("AAU12902", 
"PH0013204")), class = "data.frame", row.names = 1:2)), class = "data.frame", row.names = 1:2), 
    structure(list(resource = structure(list(`_class` = c("resource", 
    "resource", "resource"), oid = c(1869868L, 24568359L, 41439810L
    ), name = c("Brushes_2", "MicroPro #1", "Ceramics _01"
    ), barcode = c("1910.012", "1149.033", NA)), class = "data.frame", row.names = c(NA, 
    3L))), class = "data.frame", row.names = c(NA, 3L)), structure(list(
        resource = structure(list(`_class` = "resource", oid = 52952320L, 
            name = "MIDI Lab 01", barcode = NA), class = "data.frame", row.names = 1L)), class = "data.frame", row.names = 1L), 
    structure(list(resource = structure(list(`_class` = c("resource", 
    "resource", "resource", "resource"), oid = c(2195740L, 2197584L, 
    1688545L, 61592833L), name = c("Extension Cord", "Soldering Iron", 
    "Scale_Cs", "MicroPro #1"
    ), barcode = c("16.012", "16326.002", "BUSH16312.001", NA
    )), class = "data.frame", row.names = c(NA, 4L))), class = "data.frame", row.names = c(NA, 
    4L)), structure(list(resource = structure(list(`_class` = "resource", 
        oid = 58745398L, name = "Computer Station #03", 
        barcode = NA), class = "data.frame", row.names = 1L)), class = "data.frame", row.names = 1L), 
    structure(list(resource = NA), class = "data.frame", row.names = 1L))

CodePudding user response:

A bit longer answer, but (IMHO) very readable/adaptable

library(tidyverse)
L %>%
  bind_rows() %>%
  unlist(recursive = FALSE) %>%
  as.data.frame() %>%
  group_by(resource.name) %>%
  summarise(total = n())
# # A tibble: 10 × 2
#   resource.name        total
#   <chr>                <int>
# 1 Brushes_2                1
# 2 Ceramics _01             1
# 3 Computer Station #03     1
# 4 Extension Cord           1
# 5 MicroPro #1              3
# 6 MIDI Lab 01              1
# 7 Scale_Cs                 1
# 8 Soldering Iron           1
# 9 Speedlite Stand          1
#10 NA                       1

CodePudding user response:

table(unlist(lapply(my_list,\(x)if(is.data.frame(y<-x$resource)) y$name)))

           Brushes_2         Ceramics _01 Computer Station #03       Extension Cord          MicroPro #1 
                   1                    1                    1                    1                    3 
         MIDI Lab 01             Scale_Cs       Soldering Iron      Speedlite Stand 
                   1                    1                    1                    1 

You could also do:

table(subset(stack(unlist(my_list)), grepl('name', ind), values, drop = TRUE))
  • Related