【问题标题】:Multiple conditions using replace plyr or dplyr in R在 R 中使用 replace plyr 或 dplyr 的多个条件
【发布时间】:2017-11-30 16:09:57
【问题描述】:

这是一个数据集:

> 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,那么ranking=="2.4"。如果b2的doy

> 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)))})

这可行,但数据集中只剩下物种和排名。如何正确编码以使整个数据集保持排名变化? 感谢您的帮助。

【问题讨论】:

  • 您的问题有点难以理解。如果您同时按物种和部分进行拆分,则任何组合的 b2 和 b3 都没有 doy 值,因此您无法比较这些值。同样在您的 ddply 调用中, x 仅包含 mydat 的行,其中 obs == "b2" 但随后您尝试与 x$obs=="b3" 进行比较
  • @user2738526 感谢您的评论,它帮助我改进了代码以更接近我想要的,但现在还在那里。

标签: r replace dplyr plyr


【解决方案1】:

假设每个物种只有一个 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)

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 2019-01-30
    • 1970-01-01
    • 2021-09-17
    • 2023-03-13
    • 1970-01-01
    • 2016-04-18
    • 2023-03-27
    • 2018-08-22
    相关资源
    最近更新 更多