Я уже задавал здесь аналогичный вопрос о том, как подсчитывать уникальные значения из фрейма данных, но мне нужно вместо этого использовать «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».
Извините, количество уникальных строк основано как на var_1, так и на var_2
Вот вариант с tidyverse
. Мы перебираем list
из data.frame
(с map
), сгруппированные по '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]))))
Это работает для приведенного выше примера, чего я не делал, но должен был включить, так это то, что имя var_2 немного изменится в моем примере из реальной жизни, например. разновидности1, var_2 = hsapiens_gene_name и разновидности2, var_2 = mmusculus_gene_name. Вот почему я бы предпочел использовать lapply, чтобы использовать paste0, например. lapply (имя_видового_вектора, функция (и) paste0 (s, "_geen_name"))
@JackDean Если имя изменится, то можно использовать summarise_at
Спасибо, отлично работает! Я предполагаю, что «1» в summarise_at
означает суммирование на основе первого столбца?
@JackDean Причина в том, что есть group_by, и mutate_at будет рассматривать индексацию из следующего столбца, т.е. если нет group_by
, второй столбец будет проиндексирован с 2 map(all_species, ~ .x %>% summarise_at(2, n_distinct))
@JackDean Кстати, я не знаю, изменится ли эта индексация в будущем или нет, но это немного сбивает с толку
Table
был бы простым решением на базе R.
lapply(all_species, function(x) {
apply(x, 2, table)
}
)
Уникальный номер должен быть 3, верно?