【问题标题】:Loop filter colname using R使用R的循环过滤器colname
【发布时间】:2021-07-06 12:29:54
【问题描述】:

我正在尝试使用 R 以更好的方式编写此代码:

  filter(V1 != 1) %>% 
  filter(V2 != 2) %>% 
  filter(V3 != 3) %>% 
  filter(V4 != 4) %>% 
  filter(V5 != 5) %>% 
  filter(V6 != 6) %>% 
  filter(V7 != 7) %>% 
  filter(V8 != 8) %>% 
  filter(V9 != 9)```


【问题讨论】:

    标签: r loops filter


    【解决方案1】:

    使用BaseR,您可以像这样循环,

    for(i in 1:ncol(df)) {
        
        df <- df[df[,paste0("V",i)]!=i,]
    
    }
    

    虚假数据:

    df <- data.frame(matrix(round(runif(100,1,10)),10))
    colnames(df) <- paste0("V",1:10)
    

    【讨论】:

      【解决方案2】:

      这是一种在一行中使用dplyr 的方法。假设cols 是列名向量,cutoffscols 中每一列对应截止点的命名向量。

      cols <- paste0('V', 1:9)
      cutoffs <- setNames(1:9, cols)
      

      然后,我们可以通过dplyr过滤数据框df

      library(dplyr)
      df %>% filter(across(all_of(cols), ~ .x != cutoffs[cur_column()]))
      

      测试:

      set.seed(123)
      df <- as.data.frame(matrix(sample(1:9, 100*9, T), nrow = 100))
      x <- df %>% filter(across(all_of(cols), ~ .x != cutoffs[cur_column()]))
      
      colSums(mapply(`==`, x, cutoffs))
      # V1 V2 V3 V4 V5 V6 V7 V8 V9 
      #  0  0  0  0  0  0  0  0  0
      

      【讨论】:

        【解决方案3】:
        • 使用filter(across.... 语法风格
        • ~ 启动一个不可见的函数
        • .x代表列值
        • cur_column() 代表列名。使用 str_remove 从 colname 中删除 Vas.numeric 将其转换为数字。

        所以这也可以

        #some sample data creation
        set.seed(2021)
        df <- data.frame(matrix(round(runif(100,1,10)),10))
        colnames(df) <- paste0("V",1:10)
        
        df
           V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
        1   5  1  2  1  3  6  1  2  6   3
        2   8  9 10  9  9  7  6  7  5   7
        3   7  6  5 10  5  2  2  2 10   9
        4   4  6  3  9 10  6  5  9  7   6
        5   7  8  6  6  2  4  9  2  4   3
        6   7  3  9  3  8  3  2  5  3   9
        7   7  6  9  9  9  5  2  5 10   7
        8   3  9  9  3  1  4  7  4  8   8
        9   8 10 10  9  1  9  3  7  5   8
        10 10  6  8  5  8  8  1 10  5   7
        
        

        语法

        df %>% filter(across(everything(), ~ .x != as.numeric(str_remove(cur_column(), "V")) ))
        
          V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
        1  8  9 10  9  9  7  6  7  5   7
        2  7  8  6  6  2  4  9  2  4   3
        3  7  3  9  3  8  3  2  5  3   9
        4  7  6  9  9  9  5  2  5 10   7
        5  8 10 10  9  1  9  3  7  5   8
        6 10  6  8  5  8  8  1 10  5   7
        

        【讨论】:

          猜你喜欢
          • 2019-07-14
          • 2022-11-02
          • 2021-07-04
          • 2019-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-02
          • 2021-10-17
          相关资源
          最近更新 更多