[英]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
中使用merge
和split
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.