[英]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 + vegdist或group_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.