簡體   English   中英

在R中使用replace plyr或dplyr的多種條件

[英]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.

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