[英]Multiple conditions using replace plyr or dplyr in R
這是一個數據集:
> mydat
species section obs doy ranking
A A1 b1 123 2.1
A A2 b2 135 2.2
A A3 b3 147 2.3
B A1 b2 124 2.2
B A2 b3 132 2.3
B A3 b2 145 2.2
C A1 b1 120 2.1
C A2 b3 133 2.3
C A3 b2 137 2.2
我正在嘗試編碼; 對於obs == b2的每個物種,如果b2的doy> b3的doy,則等級==“ 2.4”。 如果b2的doy <b3的doy,那么rank ==“ 2.2”(保持不變),因此我得到以下結果:
> mydat2
species section obs doy ranking
A A1 b1 123 2.1
A A2 b2 135 2.2
A A3 b3 147 2.3
B A1 b2 124 2.2
B A2 b3 132 2.3
B A3 b2 145 2.4
C A1 b1 120 2.1
C A2 b3 133 2.3
C A3 b2 137 2.4
我使用了plyr軟件包來避免循環,因為我發現循環很難理解。 我知道現在很多人使用dplyr而不是plyr,所以我很高興為使用plyr或dplyr的答案。 這是我笨拙的嘗試:
require (plyr)
mydat2 <- ddply(.data=mydat,
.variables=c("species"),
function(x){
return(data.frame(replace(x$ranking, x$doy[x$obs=='b2']>x$doy[x$obs=="b3"],2.4)))})
這可行,但是數據集中只剩下物種和等級。 如何正確編寫代碼,以使整個數據集的排名保持不變? 謝謝您的幫助。
假設每個物種對於b3僅具有一個doy值,則可以將這些值作為一個表獲得,然后將其連接到另一個表以使比較簡單,所有這些都使用dplyr
:
library(dplyr)
# get a single doy value for each species
b3values <- mydat %>%
filter(obs == 'b3') %>%
group_by(species) %>%
summarize(
# using min(doy) but if there's only one value, you could use any grouping function like sum, max, etc
b3doy = min(doy)
)
# join b3values to your original data
mydat2 <- mydat %>%
left_join(b3values, by = 'species') %>%
mutate(
# use case_when() to lay out your conditions and the values you want
ranking = case_when(
obs == 'b2' & (doy > b3doy) ~ 2.4
, obs == 'b2' & (doy < b3doy) ~ 2.2
# default value is to keep the ranking as-is
, T ~ ranking
)
) %>%
# optionally, drop the extra b3doy column
select(-b3doy)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.