【问题标题】:Remove factor columns in data frame which contain specific value [duplicate]删除数据框中包含特定值的因子列[重复]
【发布时间】:2021-10-09 01:05:51
【问题描述】:

我有一个包含分类变量的数据框 - 具有 2 个级别或 1 个级别的因子。我正在尝试删除所有只有级别的列。由于我有超过 300 个分类变量,我想使用循环或函数。

这里是一个只有 5 列的示例代码,以便在这里简单:

B1 <- as.factor(c(1,1,1,1,1,1))
B2 <- as.factor(c(1,0,1,1,0,0))
B3 <- as.factor(c(0,1,1,0,1,0))
B4 <- as.factor(c(0,0,0,0,0,0))
B5 <- as.factor(c(1,0,1,0,1,0))
df <- data.frame(B1,B2,B3,B4,B5)

在这种情况下,我想删除 B1 和 B4 列,因为它们只有一个级别并且有这样的数据框

   B2 B3 B5
1  1  0  1
2  0  1  0
3  1  1  1
4  1  0  0
5  0  1  1
6  0  0  0

我尝试使用多个代码,但没有得到想要的结果。

df1 <- data.frame(df1[,xqual[,c(1:5)] == "1" & df[ ,c(1:5)] == "0"])

for (i in 2:dim(df)[2]){
  df1[,i] = which(df[,i] == "1" & df[,i] == "0") 
}

【问题讨论】:

    标签: r dataframe subset categorical-data


    【解决方案1】:

    另一个基本 R 选项

    > Filter(function(v) var(as.integer(v)),df)
      B2 B3 B5
    1  1  0  1
    2  0  1  0
    3  1  1  1
    4  1  0  0
    5  0  1  1
    6  0  0  0
    

    【讨论】:

      【解决方案2】:

      我们可以使用select 来选择具有多个唯一值的列

      library(dplyr)
      df %>%
         select(where(~ n_distinct(.) > 1))
      

      -输出

       B2 B3 B5
      1  1  0  1
      2  0  1  0
      3  1  1  1
      4  1  0  0
      5  0  1  1
      6  0  0  0
      

      或者我们可以通过all WRwapping 来查找特定值

      df %>%
          select(where(~ all(c(0, 1) %in% .)))
      

      或在base R 中使用Filter

      Filter(\(x) length(unique(x)) > 1, df)
      

      -输出

         B2 B3 B5
      1  1  0  1
      2  0  1  0
      3  1  1  1
      4  1  0  0
      5  0  1  1
      6  0  0  0
      

      或者var

      Filter(var, type.convert(df, as.is = TRUE))
      

      【讨论】:

        【解决方案3】:

        另一个基本 R 选项:

        df[sapply(df, nlevels) > 1]
          B2 B3 B5
        1  1  0  1
        2  0  1  0
        3  1  1  1
        4  1  0  0
        5  0  1  1
        6  0  0  0
        

        或者使用Filter:

        Filter(\(x) nlevels(x) - 1, df)
        

        【讨论】:

          猜你喜欢
          • 2017-09-27
          • 1970-01-01
          • 2021-08-18
          • 1970-01-01
          • 2021-12-03
          • 2020-09-27
          • 2019-07-17
          • 2021-06-20
          • 1970-01-01
          相关资源
          最近更新 更多