簡體   English   中英

我可以使用 dplyr 管道而不是覆蓋 R 中的列表嗎?

[英]Can I use a dplyr pipe instead of lapplying over lists in R?

我想知道我是否可以將 tidyverse 用於迄今為止在 R 中使用列表的任務。 我得到了每個地塊的物種豐度矩陣,我想用vegan包中的vegdist計算差異指數。 之后,我想把它放在長格式中刪除自動比較等。它就像dplyr的魅力一樣,舉個簡單的例子:

library(tidyverse)
library(vegan)
df <- data.frame(spec1=sample.int(50,10,replace=T),
             spec2=sample.int(75,10,replace=T),
             spec3=sample.int(10,10,replace=T),
             spec4=sample.int(40,10,replace=T),
             spec5=sample.int(50,10,replace=T),
             spec6=sample.int(5,10,replace=T))

 df%>%
  vegdist() %>%
  as.matrix() %>%
  as_tibble(rownames= "rownames") %>%
  pivot_longer(-rownames) %>%
  filter(rownames < name) 

現在我想做同樣的事情,但是物種屬於不同的類別,每個類別都必須得到自己的距離矩陣,並且只有在它可以放回單個長格式數據框或小標題之后。

cat <- data.frame(spec=c("spec1","spec2","spec3","spec4","spec5","spec6"),
                  group=c("a","b","c","b","a","c"))
df%>%
  pivot_longer(cols = everything(),values_to="abundance",names_to="spec")%>%
  left_join(cat, by="spec")

開始很簡單,但是在我習慣按列將數據拆分為列表的時候,我正在努力尋找解決方案。 我嘗試了group_by + pivot_wider + vegdistgroup_split的組合,但不幸的是無法提出一個可行的解決方案。 有沒有人有建議,或者我應該堅持這種情況的清單?

我們可以split 'spec' 按 'group' 拆分為一個list ,遍歷list ,然后根據列表中的元素select list並應用vegdist

library(vegan)
library(purrr)
library(dplyr)
library(tidyr)
out <- map_dfr(split(cat$spec, cat$group), 
   ~  df %>%
         select(all_of(.x)) %>% 
         vegdist() %>% 
         as.matrix %>% 
         as_tibble(rownames = "rownames") %>% 
        pivot_longer(-rownames) %>% 
        filter(rownames < name), .id = 'group')

-輸出

> out
# A tibble: 135 × 4
   group rownames name   value
   <chr> <chr>    <chr>  <dbl>
 1 a     1        2     0.268 
 2 a     1        3     0.35  
 3 a     1        4     0.208 
 4 a     1        5     0.0682
 5 a     1        6     0.328 
 6 a     1        7     0.196 
 7 a     1        8     0.189 
 8 a     1        9     0.178 
 9 a     1        10    0.178 
10 a     2        3     0.0822
# … with 125 more rows

如果我們想要寬幅格式,

cat %>% 
  pivot_wider(names_from = group, values_from = spec, values_fn = list) %>%
  summarise(across(everything(), ~
    df %>%
     select(all_of(unlist(.x))) %>% 
     vegdist() %>%
     as.matrix %>%
     as_tibble(rownames = "rownames") %>% 
     pivot_longer(-rownames) %>%
     filter(rownames < name))) %>% 
     unnest(where(is.list),  names_sep = "_")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM