【问题标题】:How to make conditions for this case in a R Code如何在 R 代码中为这种情况创造条件
【发布时间】:2022-01-23 02:07:55
【问题描述】:

我想在下面的代码中做一个简短的条件。请注意,我有输入数据dmda<-"2021-07-01"CategoryChosse<-"FDE"DTest<-"0"。如果将代码运行到med,您会注意到med 中没有DTest="0" 的行。正如您在Dx 中看到的那样,我使用date1 (28/06) 之前的日期进行分析,请注意在date1 之前的几天内我没有任何DTT = "0",所以在med我什么都没有。

获取代码med

library(dplyr)
library(tidyverse)
library(lubridate)

df1 <- structure(
  list(date1= c("2021-06-28","2021-06-28","2021-06-28","2021-06-28"),
       date2 = c("2021-06-23","2021-06-24","2021-06-30","2021-07-01"),
       DTT= c("Hol","Hol","Hol",0),
       Week= c("Wednesday","Thursday","Wednesday","Thursday"),
       Category = c("ABC","FDE","ABC","FDE"),
       DR1 = c(4,1,1,2),
       DR01 = c(4,1,2,3), DR02= c(4,2,0,2),DR03= c(9,5,0,1),
       DR04 = c(5,4,3,2),DR05 = c(5,4,0,2)),
  class = "data.frame", row.names = c(NA, -4L))

dmda<-"2021-07-01"
CategoryChosse<-"FDE"
DTest<-"0"

 Dx<-subset(df1,df1$date2<df1$date1)
  
  x<-Dx %>% select(starts_with("DR0"))
  
  x<-cbind(Dx, setNames(Dx$DR1 - x, paste0(names(x), "_PV")))
  
  PV<-select(x, date2,Week, Category, DTT, DR1, ends_with("PV"))
  
  med<-PV %>%
        group_by(Category,Week,DTT) %>%
        summarize(across(ends_with("PV"), median))
> med
# A tibble: 2 x 8
# Groups:   Category, Week [2]
  Category Week      DTT   DR01_PV DR02_PV DR03_PV DR04_PV DR05_PV
  <chr>    <chr>     <chr>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
1 ABC      Wednesday Hol         0       0      -5      -1      -1
2 FDE      Thursday  Hol         0      -1      -4      -3      -3

从那里,我想创建两个条件来生成一个名为SPV的变量

如果我在med 中有Dtype="0",请执行以下操作:

  SPV<-df1%>%
    inner_join(med, by = c('Category', 'Week','DTT')) %>%
    mutate(across(matches("^DR0\\d+$"), ~.x + 
                    get(paste0(cur_column(), '_PV')),
                  .names = '{col}_{col}_PV')) %>%
    select(date1:Category, DR01_DR01_PV:last_col())

SPV <- SPV %>%
    filter(date2 == dmda, Category == CategoryChosse, DTT==DTest)    

如果我在med 中没有Dtype="0",请执行以下操作:

     SPV<-df1%>%
        inner_join(med, by = c('Category', 'Week')) %>%
        mutate(across(matches("^DR0\\d+$"), ~.x + 
                        get(paste0(cur_column(), '_PV')),
                      .names = '{col}_{col}_PV')) %>%
        select(date1:Category, DR01_DR01_PV:last_col())
  
    SPV <- SPV %>%
        filter(date2 == dmda, Category == CategoryChosse)

【问题讨论】:

    标签: r


    【解决方案1】:

    根据条件,可以使用if/else 表达式

    if(any(med$DTT == DTest & med$Category== CategoryChosse, na.rm = TRUE)) {
    
      SPV<-df1%>%
        inner_join(med, by = c('Category', 'Week','DTT')) %>%
        mutate(across(matches("^DR0\\d+$"), ~.x + 
                        get(paste0(cur_column(), '_PV')),
                      .names = '{col}_{col}_PV')) %>%
        select(date1:Category, DR01_DR01_PV:last_col())
    
        SPV <- SPV %>%
           filter(date2 == dmda, Category == CategoryChosse, DTT==DTest)  
        } else {
        
          SPV <- df1%>%
               inner_join(med, by = c('Category', 'Week')) %>%
               mutate(across(matches("^DR0\\d+$"), ~.x + 
                               get(paste0(cur_column(), '_PV')),
                             .names = '{col}_{col}_PV')) %>%
               select(date1:Category, DR01_DR01_PV:last_col())
      
           SPV <- SPV %>%
               filter(date2 == dmda, Category == CategoryChosse)
               }
    

    【讨论】:

    • 就是这样阿克伦。我有一个问题:DTT == "0" 可能会有所不同,因为它取决于我在此处设置的值:DTest&lt;-"0"。所以在你制作的代码中,有没有办法让它保持一般,所以你不需要指定"0"
    • @Antonio 只需在更新中将其更改为 DTest
    • 谢谢@akrun,还有一个问题,如果你能回复:关于if(any(med$DTT == DTest, na.rm = TRUE)),可以插入其他条件,例如:med$DTT == DTest &amp; med$Category== CategoryChosse?
    • @Antonio 您可以在更新中使用any 包装复合表达式
    • 完美,我刚刚检查过了。感谢您的快速回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2014-11-09
    • 2020-11-21
    相关资源
    最近更新 更多