0

我需要对我的真实 df 使用 lapply/sapply 或其他递归方法来计算每列/变量中有多少重复值。

这里我用一个小例子来重现我的案例:

library(dplyr)

df <- data.frame(
var1 = c(1,2,3,4,5,6,7,8,9,10 ),
var2 = c(1,1,2,3,4,5,6,7,9,10 ),
var3 = c(1,1,1,2,3,4,5,6,7,8 ),
var4 = c(2,2,1,1,2,1,1,2,1,2 ),
var5 = c(1,1,1,1,1,4,5,5,6,7 ),
var6 = c(4,4,4,5,5,5,5,5,5,5 )   
)

r nrow(df)在我的数据集中,现在我需要获取每列的重复值的百分比。假设我的 realdf有很多列,我需要递归地做。我尝试使用lapply/sapply,但它没有工作...

# create function that is used in lapply
perc_repeated <- function(variables){
  
  paste(round((sum(table(df$variables)-1) / nrow(df))*100,2),"%")
  
}

perce_repeated_values <- lapply(df, perc_repeated) 
perce_repeated_values

如果我的数据框的列数增加到 700 左右,对每列使用一些递归函数并在数据框中从最大到最小有序地获取结果,如何以最佳方式执行此操作?(例如,对于达到 0% 的变量具有 100% 重复值的变量),例如:

df_repeated

variable      perc_repeated_values
var6                    80%
var4                    80%
var5                    50%
var3                    20%
var2                    20%
var1                     0%

4

1 回答 1

2

这可以很容易地完成dplyr::summarize()

library(tidyverse)

df <- data.frame(
  var1 = c(1,2,3,4,5,6,7,8,9,10 ),
  var2 = c(1,1,2,3,4,5,6,7,9,10 ),
  var3 = c(1,1,1,2,3,4,5,6,7,8 ),
  var4 = c(2,2,1,1,2,1,1,2,1,2 ),
  var5 = c(1,1,1,1,1,4,5,5,6,7 ),
  var6 = c(4,4,4,5,5,5,5,5,5,5 )   
)

df %>% 
  summarise(across(everything(),
                   ~100 * (1 - n_distinct(.)/n()))) %>% 
  pivot_longer(everything(), 
               names_to = "var", 
               values_to = "percent_repeated") %>% 
  arrange(desc(percent_repeated))
#> # A tibble: 6 x 2
#>   var   percent_repeated
#>   <chr>            <dbl>
#> 1 var4                80
#> 2 var6                80
#> 3 var5                50
#> 4 var3                20
#> 5 var2                10
#> 6 var1                 0

reprex 包(v2.0.1)创建于 2022-01-09

于 2022-01-09T14:36:59.610 回答