删除只包含唯一值的列。

7
我希望您能删除仅具有唯一值的列。
首先,我尝试了单个列,它可以工作:
data %/% 
  select_if(length(unique(data$policy_id)) > 1)

然后我尝试将它应用于多列,如下所示:

data %/% 
  select_if(length(unique(data[, c("policy_date", "policy_id"])) > 1)

但是它没有起作用。我认为这是由于我缺乏经验而导致的一个概念上的错误。

提前感谢。

5个回答

4

你可以使用select(where())函数。

假设我有这样一个数据框:

df <- data.frame(A = LETTERS[1:5], B = 1:5, C = 2)

df
#>   A B C
#> 1 A 1 2
#> 2 B 2 2
#> 3 C 3 2
#> 4 D 4 2
#> 5 E 5 2

那么我就可以执行:

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

#>   A B
#> 1 A 1
#> 2 B 2
#> 3 C 3
#> 4 D 4
#> 5 E 5

3
一个更加类似于dplyr的选项是 df %>% select(where(~ n_distinct(.) > 1))。意思是选择数据框中那些某一列不止一个不同取值的变量。 - tmfmnk

3

一些基本的R选项:

  • 使用lengths + unique + sapply
subset(df,select = lengths(sapply(df,unique))>1)
  • 使用 Filter + length + unique
Filter(function(x) length(unique(x))>1,df)

1

Does this work:

> df <- data.frame(col1 = 1:10,
+                  col2 = rep(10,10),
+                  col3 = round(rnorm(10,1)))
> df
   col1 col2 col3
1     1   10    1
2     2   10    0
3     3   10    1
4     4   10    1
5     5   10    1
6     6   10    0
7     7   10    2
8     8   10    1
9     9   10    1
10   10   10    1
> df %>% select_if(~length(unique(.)) > 1)
   col1 col3
1     1    1
2     2    0
3     3    1
4     4    1
5     5    1
6     6    0
7     7    2
8     8    1
9     9    1
10   10    1
> 

我认为现在最好避免使用dplyr中的_if_at_all函数,因为开发团队已经放弃了这些方法。我自己也需要一点时间来适应“新”的方式。 - user10917479

0
另一种选择是使用 purrr:
df %>% purrr::keep(~all(n_distinct(.) > 1))
df %>% purrr::keep(~all(length(unique(.)) > 1))

df %>% purrr::discard(~!all(n_distinct(.) > 1))
df %>% purrr::discard(~!all(length(unique(.)) > 1))

使用applytable混合生成相同的输出。

df[, apply(df, 2, function(i) length(table(i)) > 1)]

df <- data.frame(A = LETTERS[1:5], B = 1:5, C = 2)

0

使用 base R 的一个选项

df[sapply(df, function(x) length(unique(x))) > 1]

数据

df <- data.frame(A = LETTERS[1:5], B = 1:5, C = 2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接