![](/img/trans.png)
[英]How do I turn a table into a list of observations with various attributes in R?
[英]How to generate list/table of all the observations with a given value. In R
我有一個大型數據集(asv_ar2),指示給定物種在給定位置被記錄的次數。 它如下所示:
物種 | 位置1 | 位置2 | 位置 3 | loc4 |
---|---|---|---|---|
sp1 | 0 | 1 | 0 | 4 |
sp2 | 7 | 3 | 0 | 2 |
sp3 | 3 | 1 | 0 | 0 |
我想為每個物種獲取一個列表/表格,其中包含找到它的位置(該變量的值不為 0)。 就像是:
或者相反,在某個位置發現的物種。
我可以使用 dplyr 的過濾器 function 的值>0 的 select 行,但只能逐個位置。 a1<-filter(asv_ar2,asv_ar2[,2]>0)[,c(1,2,8)]
我嘗試制作一個將它們連接在一起的循環,但它只顯示第一個位置
for(i in 2:1156){ locs<-filter(asv_ar2,asv_ar2[,i]>0)[c(1,i)]}
我不知道如何加入所有的迭代。 或者,如果有更好的方法來完成這一切。
有什么建議么?
謝謝
我希望這是您的想法:
library(dplyr)
library(tidyr)
library(purrr)
df %>%
mutate(data = pmap(df %>% select(!Specie), ~ names(c(...)[c(...) != 0]))) %>%
unnest_wider(data)
# A tibble: 3 x 8
Specie loc1 loc2 loc3 loc4 ...1 ...2 ...3
<chr> <int> <int> <int> <int> <chr> <chr> <chr>
1 sp1 0 1 0 4 loc2 loc4 NA
2 sp2 7 3 0 2 loc1 loc2 loc4
3 sp3 3 1 0 0 loc1 loc2 NA
您可以添加一個具有列名的新列,其中該列的值連續大於 0。
asv_ar2$locs <- apply(asv_ar2[-1] > 0, 1, function(x)
toString(names(asv_ar2[-1])[x]))
asv_ar2
# Specie loc1 loc2 loc3 loc4 locs
#1 sp1 0 1 0 4 loc2, loc4
#2 sp2 7 3 0 2 loc1, loc2, loc4
#3 sp3 3 1 0 0 loc1, loc2
在dplyr
,您可以使用rowwise
:
library(dplyr)
asv_ar2 %>%
rowwise() %>%
mutate(locs = toString(names(.[-1])[c_across(starts_with('loc')) > 0]))
我們可以在tidyverse
中以更加矢量化的方式來做到這一點,即不使用rowwise
。 在這里,我們遍歷 'loc' 列,如果值不為 0(默認across
返回為NA
),則返回列名( cur_column
),通過添加后綴或前綴( case_when
) _new
.names
以創建新列,然后利用unite
將那些 '_new' 列折疊成一個
library(dplyr)
library(tidyr)
df1 %>%
mutate(across(starts_with('loc'), ~ case_when(. != 0 ~ cur_column()),
.names = '{.col}_new')) %>%
unite(locs, ends_with('new'), sep=", ", na.rm = TRUE)
# Specie loc1 loc2 loc3 loc4 locs
#1 sp1 0 1 0 4 loc2, loc4
#2 sp2 7 3 0 2 loc1, loc2, loc4
#3 sp3 3 1 0 0 loc1, loc2
df1 <- structure(list(Specie = c("sp1", "sp2", "sp3"), loc1 = c(0L,
7L, 3L), loc2 = c(1L, 3L, 1L), loc3 = c(0L, 0L, 0L), loc4 = c(4L,
2L, 0L)), class = "data.frame", row.names = c(NA, -3L))
你可以做:
apply(df, 1, function(x) paste(x[1], paste(names(which(x[-1] > 0)), collapse = ", ")))
[1] "sp1 loc2, loc4" "sp2 loc1, loc2, loc4" "sp3 loc1, loc2"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.