【问题标题】:Create blank in row element if condition is met如果满足条件,则在行元素中创建空白
【发布时间】:2021-10-05 06:34:45
【问题描述】:

我的数据框如下:

              df <- data.frame(Resource_Code = c("B-T234","B-T234","B-T234"),
             "Valid_To"= c("2021-10-17", "2021-11-28", "2021-10-31"),
             "V1"= c("2021-10-17", "2021-10-17", "2021-10-24"),
             "V2" = c("2021-10-24", "2021-10-31", "2021-10-31"),
             "V3" = c("2021-10-31", "2021-11-07", "2021-11-14"),
             "V4" = c("2021-11-14", "2021-11-21", "2021-11-28"),
             "V5" = c("2021-12-05", "2021-11-28", "2021-12-12"),
             "V6" = c("2021-12-12", "2021-12-19", "2021-12-26"),
             "V7" = c("2022-01-02", "2022-01-09", "2022-01-16"),
             "V8" = c("2022-01-23", "2022-01-30", "2022-02-06"),
             "V9" = c("2022-02-13", "2022-02-20", "2022-02-27"),
             "v10" = c("2022-02-27", "2022-03-06", "2022-03-13"))

在所需的输出中,如果任何行单元格(从 V1 列开始)等于相应的“Valid_To”行单元格,则后续单元格(从 V1 列开始)应变为空白

实际的DF有数百行和列以及日期格式的V1到VN列

想要的输出如下:

              df1 <- data.frame(Resource_Code = c("B-T234","B-T234","B- 
              T234"),
             "Valid_To"= c("2021-10-17", "2021-11-28", "2021-10-31"),
             "V1"= c("2021-10-17", "2021-10-17", "2021-10-24"),
             "V2" = c("", "2021-10-31", "2021-10-31"),
             "V3" = c("", "2021-11-07", ""),
             "V4" = c("", "2021-11-21", ""),
             "V5" = c("", "2021-11-28", ""),
             "V6" = c("", "", ""),
             "V7" = c("", "", ""),
             "V8" = c("", "", ""),
             "V9" = c("", "", ""),
             "v10" = c("", "", ""))

我的代码如下: 我的代码没有给出想要的输出 请帮忙

             for (i in 1:nrow(df1)){
                 for (j in 3:ncol(df1) ){
                     if (df[i,j] == df1[1,2]){
                         df[i,j + 1] <- "" 
                                             }

                                        }
                                    }

【问题讨论】:

    标签: r


    【解决方案1】:

    使用apply 的基本 R 方式。

    match 返回Valid_To 值与V1 到V10 列中的日期匹配的位置。如果match 存在,那么我们将值从下一个位置变为空白,直到系列结束。

    df[-1] <- t(apply(df[-1], 1, function(x) {
      inds <- match(x[1], x[-1])
      if(length(inds)) x[(inds + 2):length(x)] <- ''
      x
    }))
    df
    
    #  Resource_Code   Valid_To         V1         V2         V3         V4         V5 V6 V7 V8 V9 v10
    #1        B-T234 2021-10-17 2021-10-17                                                            
    #2        B-T234 2021-11-28 2021-10-17 2021-10-31 2021-11-07 2021-11-21 2021-11-28                
    #3        B-T234 2021-10-31 2021-10-24 2021-10-31                                          
    

    【讨论】:

      【解决方案2】:

      基本向量化解决方案

      tmp=grepl("V[0-9]+",colnames(df))
      df[,tmp][df[,"Valid_To",drop=T]<df[,tmp]]=NA
      
        Resource_Code   Valid_To         V1         V2         V3         V4         V5   V6   V7
      1        B-T234 2021-10-17 2021-10-17       <NA>       <NA>       <NA>       <NA> <NA> <NA>
      2        B-T234 2021-11-28 2021-10-17 2021-10-31 2021-11-07 2021-11-21 2021-11-28 <NA> <NA>
      3        B-T234 2021-10-31 2021-10-24 2021-10-31       <NA>       <NA>       <NA> <NA> <NA>
          V8   V9        v10
      1 <NA> <NA> 2022-02-27
      2 <NA> <NA> 2022-03-06
      3 <NA> <NA> 2022-03-13
      

      【讨论】:

        【解决方案3】:

        如果你想使用循环,

        for (i in 1:dim(df)[1]){
          dummy <- c()
          for (j in 3:dim(df)[2]){
            if (df[i,j] == df[i,2]){
              dummy <- c(dummy, j)
            }
          }
          check <- min(dummy) + 1
          df[i,c(check: dim(df)[2])] <- NA
        }
        df
        
          Resource_Code   Valid_To         V1         V2         V3         V4         V5   V6   V7   V8   V9  v10
        1        B-T234 2021-10-17 2021-10-17       <NA>       <NA>       <NA>       <NA> <NA> <NA> <NA> <NA> <NA>
        2        B-T234 2021-11-28 2021-10-17 2021-10-31 2021-11-07 2021-11-21 2021-11-28 <NA> <NA> <NA> <NA> <NA>
        3        B-T234 2021-10-31 2021-10-24 2021-10-31       <NA>       <NA>       <NA> <NA> <NA> <NA> <NA> <NA>
        

        【讨论】:

          猜你喜欢
          • 2013-11-15
          • 2015-11-03
          • 1970-01-01
          • 2020-06-27
          • 2017-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多