【问题标题】:drop columns that take less than n values?删除小于 n 值的列?
【发布时间】:2016-11-03 19:31:54
【问题描述】:

假设我有一个如下的数据框:

df <- data.frame(v1 = sample(1:10, 100, replace = T), v2 = sample(LETTERS, 100, replace = T),
                 V3 = sample(letters, 100, replace = T), v4 = sample(1:15, 100, replace = T))

我想创建一个新的数据框 df2 只包含超过 10 个值的列。因此,在此示例中,它将是 v2、v3 和 v4。我怎样才能做到这一点?实际上,我的数据框有数千列。

我试过了:

df2 <- df %>% select(which(length(unique(.))>10))

【问题讨论】:

  • df[, sapply(df, function(x) length(unique(x))) &gt; 10]

标签: r dplyr


【解决方案1】:

或者,您可以使用dplyr 中的select_if(),您可以将函数作为谓词传递以选择列:

library(dplyr)
df %>% select_if(function(col) n_distinct(col) > 10)

#    v2 V3 v4
#1    T  a 12
#2    R  k  7
#3    L  l  1
# ...

或者在dplyr版本&gt;=1.00中使用selectwhere

df  %>%
     select(where(~ n_distinct(.) > 10))

【讨论】:

    【解决方案2】:

    笨重,但它有效...

    x<-as.data.frame(t(apply(df,2,function(x) length(x[unique(x)]))>10))
    
    df[,names(x[,x>0])]
    

    【讨论】:

    • 它有效。有更好的解决方案,但诋毁花费在工作解决方案上的时间甚至没有发布为什么是蹩脚的。做更好的 SE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2023-02-13
    • 2016-07-10
    相关资源
    最近更新 更多