首页 > 解决方案 > 有没有办法删除 R 中几乎重复的列

问题描述

dplyr 中是否有删除几乎重复的列的方法?例如,我想删除以下 tibble 中重复率大于 75% 的列。这将删除 b 列和 c 列,但不会删除 d 列,因为它与任何其他列只有 60% 相同。

tibble(
       a = c(1,2,3,4,5),
       b = c(1,2,3,4,5),
       c = c(1,2,3,4,4),
       d = c(1,2,3,6,6)
)

标签: rdplyrduplicates

解决方案


dplyr老实说,我认为最好不要这样做。其中许多功能可以用purrr/ -变体替换tidyr,但我认为在dplyr.

Z <- tibble(
       a = c(1,2,3,4,5),
       b = c(1,2,3,4,5),
       c = c(1,2,3,4,4),
       d = c(1,2,3,6,6)
)
eg <- expand.grid(seq_len(ncol(Z)), seq_len(ncol(Z)))
eg <- eg[ eg$Var1 < eg$Var2, ]
eg
#    Var1 Var2
# 5     1    2
# 9     1    3
# 10    2    3
# 13    1    4
# 14    2    4
# 15    3    4
eg$similarity <- mapply(function(i,j) sum(Z[,i] == Z[,j]) / nrow(Z), eg$Var1, eg$Var2)
eg
#    Var1 Var2 similarity
# 5     1    2        1.0
# 9     1    3        0.8
# 10    2    3        0.8
# 13    1    4        0.6
# 14    2    4        0.6
# 15    3    4        0.6
unique(eg$Var2[ eg$similarity >= 0.75 ])
# [1] 2 3
Z[, -unique(eg$Var2[ eg$similarity >= 0.75 ]) ]
# # A tibble: 5 x 2
#       a     d
#   <dbl> <dbl>
# 1     1     1
# 2     2     2
# 3     3     3
# 4     4     6
# 5     5     6

推荐阅读