【问题标题】:Filter dataframe based on input vector containing column names根据包含列名的输入向量过滤数据框
【发布时间】:2019-02-06 05:50:57
【问题描述】:

我有一个如下的数据框

Sol_name    geo_pos     loc_pos     dol_pos    pol_pos   kol_pos

A            1            1          0          0         1
B            0            1          1          0         0
C            1            0          1          1         1
D            0            1          0          0         1

我需要创建一个函数,用户可以在其中将列名输入到向量中,并且数据框将被过滤,其中任何列中的值为 1

示例:如果输入是col_nm = c("geo_pos","dol_pos"),那么我要查找的输出是

Sol_name    geo_pos     loc_pos     dol_pos    pol_pos   kol_pos

A            1            1          0          0         1
B            0            1          1          0         0
C            1            0          1          1         1

有什么有效的方法吗?

数据

df <- read.table(text="Sol_name    geo_pos     loc_pos     dol_pos    pol_pos   kol_pos
A            1            1          0          0         1
B            0            1          1          0         0
C            1            0          1          1         1
D            0            1          0          0         1",h=T)

【问题讨论】:

    标签: r dplyr data-manipulation


    【解决方案1】:

    我们可以在这里有效地使用rowSums 来过滤所选列中至少有一个“1”的行。

    get_one_rows <- function(cols) {
        df[rowSums(df[cols] == 1) > 0, ]
    }
    
    col_nm = c("geo_pos","dol_pos")
    get_one_rows(col_nm)
    
    # Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos
    #1        A       1       1       0       0       1
    #2        B       0       1       1       0       0
    #3        C       1       0       1       1       1
    
    
    col_nm = c("kol_pos")
    get_one_rows(col_nm)
    
    #  Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos
    #1        A       1       1       0       0       1
    #3        C       1       0       1       1       1
    #4        D       0       1       0       0       1
    

    【讨论】:

      【解决方案2】:

      随着潮汐:

      df %>% filter_at(col_nm,any_vars(.==1))
      
      #  Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos
      #1        A       1       1       0       0       1
      #2        B       0       1       1       0       0
      #3        C       1       0       1       1       1
      

      【讨论】:

        【解决方案3】:

        plyr:

        library(plyr)
        unique(ldply(col_nm,.fun = function(x){(df[df[x]==1,])}))
        

        输出:

             Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos
        1        A       1       1       0       0       1
        2        C       1       0       1       1       1
        3        B       0       1       1       0       0
        

        unique(as.data.frame(do.call(rbind, lapply(col_nm, function(x) df[df[x]==1,]))))
        

        【讨论】:

          【解决方案4】:

          base R 选项与Reduce

          df1[Reduce(`|`, df1[col_nm]),]
          #  Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos
          #1        A       1       1       0       0       1
          #2        B       0       1       1       0       0
          #3        C       1       0       1       1       1
          

          【讨论】:

            【解决方案5】:

            你可以使用pmax

            df[as.logical(do.call(pmax,df[col_nm])),]
            
            #   Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos
            # 1        A       1       1       0       0       1
            # 2        B       0       1       1       0       0
            # 3        C       1       0       1       1       1
            

            【讨论】:

              猜你喜欢
              • 2021-04-18
              • 1970-01-01
              • 2016-12-05
              • 1970-01-01
              • 2018-08-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多