【问题标题】:How to use lapply to count unique values from a list in r如何使用 lapply 计算 r 中列表中的唯一值
【发布时间】:2018-05-01 15:08:07
【问题描述】:

我之前在这里问过一个类似的问题,关于如何计算数据框中的唯一值,但我需要改用“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”函数对第二个列表进行相同的处理

【问题讨论】:

  • 唯一数应该是3吧?
  • 对不起,基于 var_1 和 var_2 的唯一行数

标签: r count bioinformatics lapply biomart


【解决方案1】:

这是tidyverse 的选项。我们循环遍历data.framelist(和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)))

或者在循环list之后使用distinct,然后执行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(species_name_vector, function(s) paste0(s, "_geen_name"))
  • @JackDean 如果名字变了,那么你可以使用summarise_at
  • 谢谢,效果很好!我假设summarise_at 中的“1”表示基于第一列的汇总?
  • @JackDean 原因是存在 group_by 和 mutate_at 会考虑从下一列开始索引,即如果没有group_by,则第2列将索引为2 map(all_species, ~ .x %&gt;% summarise_at(2, n_distinct))
  • @JackDean BTW,我不知道这个索引将来会不会改变,但这有点令人困惑
【解决方案2】:

Table 将是一个简单的 base-R 解决方案。

lapply(all_species, function(x) {
 apply(x, 2, table) 
  }
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    相关资源
    最近更新 更多