簡體   English   中英

根據變量對 dataframe 行進行分組,鏈接的 dataframe

[英]Grouping dataframe rows based on variable in a separate, linked dataframe

假設我有兩個數據框,一個包含環境數據 ( env.df ) 和其他物種出現 ( species.df ),兩者都具有相同的行名。 我想根據env.df中列(Year)的值對species.df中的行進行分組,然后分別計算每年的統計數據。

env.df:

              Site  Year
A2015           A    2015
A2016           A    2016
A2017           A    2017
B2015           B    2015
B2016           B    2016
B2017           B    2017

species.df:

               Species1  Species 2 Species 3
A2015             1          1          1
A2016             0          0          1
A2017             0          0          1
B2015             1          0          1
B2016             1          1          1
B2017             1          1          0

我不想species.df添加任何列,因為我需要使用的統計函數只能處理按物種分類的樣本數據集。 我知道如何分別從每年的 select 樣本中獲取樣本-species.df species.df[env.df$Year== '2015',]等等-但我可以使用每年重復的單行代碼來完成。 我只能讓dplyr group_by function 在env.df上工作,但不知道如何將其擴展到鏈接的 species.df

非常感謝

這更像是一個建議,因為我沒有提供尊重您的約束的代碼。 但我也處理過生態數據,以及像“vegan”這樣需要基於列的數據的包。

我的建議是合並兩個 data.frame,當你需要運行測試時,相應地設置這個 data.frame 的子集(例如使用x[,3:7]或 dplyr 的select() )。 對於未來的讀者(包括你自己)來說,這將比讓他們分開並運行充滿 for 循環和合並的代碼更容易和更容易理解。

你想要這樣的東西嗎?

lapply(
  with(env.df, split(row.names(env.df), Year)),
  function(k) species.df[k, ]
)

$`2015`
      Species1 Species2 Species3
A2015        1        1        1
B2015        1        0        1

$`2016`
      Species1 Species2 Species3
A2016        0        0        1
B2016        1        1        1

$`2017`
      Species1 Species2 Species3
A2017        0        0        1
B2017        1        1        0

或者

split(
  cbind(
    env.df,
    species.df[match(row.names(species.df), row.names(env.df)), ]
  ),
  env.df$Year
)

這使

$`2015`
      Site Year Species1 Species2 Species3
A2015    A 2015        1        1        1
B2015    B 2015        1        0        1

$`2016`
      Site Year Species1 Species2 Species3
A2016    A 2016        0        0        1
B2016    B 2016        1        1        1

$`2017`
      Site Year Species1 Species2 Species3
A2017    A 2017        0        0        1
B2017    B 2017        1        1        0

或者我們在base R中使用mergesplit

out <- merge(env.df, species.df, by = 'row.names')
row.names(out) <- out$Row.names
split(out[startsWith(names(out), 'Species')], out$Year)

暫無
暫無

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

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