Как использовать lapply для подсчета уникальных значений из списка в r - PullRequest
0 голосов
/ 01 мая 2018

Ранее я задавал похожий вопрос о том, как считать уникальные значения из фрейма данных, но мне нужно вместо этого использовать «lapply», потому что ранее использовавшийся метод не работает или я не могу заставить его работать с список. Мне также сказали, что использование одной из функций применения будет лучше.

Это мои данные:

species1 <- data.frame(var_1 = c("a","a","a","b", "b", "b"), var_2 = c("c","c","d", "d", "e", "e"))

species2 <- data.frame(var_1 = c("f","f","f","g", "g", "g"), var_2 = c("h","h","i", "i", "j", "j"))

all_species <- list()

all_species[["species1"]] <- species1
all_species[["species2"]] <- species2

Я хочу использовать lapply, чтобы получить количество уникальных строк для каждого из моих списков, например, мне нужен вывод вроде:

count_all_species <- list()
count_all_species[["species1"]] <- data.frame(var_1 = c("a", "b"), unique_number = c("2", "2"))

Затем то же самое для второго списка с использованием функции "lapply"

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Table будет простым решением base-R.

lapply(all_species, function(x) {
 apply(x, 2, table) 
  }
)
0 голосов
/ 01 мая 2018

Вот вариант с tidyverse. Мы перебираем list из data.framemap), сгруппированные по 'var_1', summarise, чтобы получить количество различных элементов в 'var_2' (n_distinct)

library(dplyr)
library(purrr)
map(all_species, ~ .x %>%
                     group_by(var_1) %>% 
                     summarise(unique_number = n_distinct(var_2)))

Или используйте distinct после цикла list, а затем выполните count

map(all_species, ~ .x %>% 
                     distinct() %>% 
                     dplyr::count(var_1))

Обновление

Если имя переменной меняется, то мы можем использовать положение в summarise_at

map(all_species, ~ .x %>%
                     group_by(var_1) %>% 
                     summarise_at(1, n_distinct))

Или другой вариант - преобразовать строку имени столбца в символ (rlang::sym), а затем выполнить оценку (!!)

map(all_species, ~ .x %>%
             group_by(var_1) %>% 
             summarise(unique_number = n_distinct(!! rlang::sym(names(.x)[2]))))
...