【问题标题】:How create two Variable and filter with map_dbl [duplicate]如何使用 map_dbl 创建两个变量和过滤器 [重复]
【发布时间】:2022-01-18 03:14:21
【问题描述】:

我有以下数据

Year    <- c("2021","2021","2021","2021","2021","2021")
Month   <- c("8","8","8","8","8","8")
Day <- c("10","15","18","20","22","25")
Hour <- c("171110","171138","174247","183542","190156","190236")
Id_Type <-  c("2","2","1","","1","")
Code_Intersecction <- c("340","","","210","750","980")

Data = data.frame(Year,Month,Day,Hour,Id_Type,Code_Intersecction)

我需要计算基础中存在的“”的数量,因为如果它大于 5%,则使用以下值,否则取值为 1,否则为 0

Data_Null = as.data.frame(purrr::map_dbl(Data, .f = function(x){ifelse(round(sum(x == '')/nrow(Data)*100L,3) >= 5, 1, 0)}))
colnames(Data_Null) = "Null"

当我看到数据框时问题就来了,我只需要一列而不是 2;名称和值 0/1

如何让它如下所示

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    我们可以在base R 中的逻辑矩阵上使用colMeans,将命名向量转换为带有stack 的两列data.frame

    stack(+(colMeans(Data == "") > 0.05))[2:1]
    

    解释 - Data == "" 返回一个逻辑矩阵,colMeans 获取每列逻辑向量的mean(这将是 TRUE 值的百分比 (*100)) ,然后通过与0.05 (5%) 比较转换为逻辑向量。可以使用 (+) 或使用 as.integer 将逻辑合并为二进制。 colMeans 的输出是一个名为 vector 的名称,它保持不变。 stack 将逻辑命名向量转换为两列 data.frame。索引 ([2:1]) 将对列重新排序,即第 2 列首先出现,然后是第 1 列。

    -输出

                     ind values
    1               Year      0
    2              Month      0
    3                Day      0
    4               Hour      0
    5            Id_Type      1
    6 Code_Intersecction      1
    

    使用tidyverse,等效为enframe(来自tibble

    library(dplyr)
    library(tidyr)
    library(purrr)
    map(Data, ~ +(round(mean(.x == ""), 3) * 100 >= 5)) %>%
      enframe(name = 'Variables') %>%
      unnest(value)
    # A tibble: 6 × 2
      Variables          value
      <chr>              <int>
    1 Year                   0
    2 Month                  0
    3 Day                    0
    4 Hour                   0
    5 Id_Type                1
    6 Code_Intersecction     1
    

    【讨论】:

    • 你能解释一下代码栈中的+号是什么意思吗(+(colMeans(Data == "") > 0.05))[2:1]
    【解决方案2】:

    使用tibble:rownames_to_column:

    tibble::rownames_to_column(Data_Null, var ="Variables")
    
    # A tibble: 6 x 2
      Variables           Null
      <chr>              <dbl>
    1 Year                   0
    2 Month                  0
    3 Day                    0
    4 Hour                   0
    5 Id_Type                1
    6 Code_Intersecction     1
    

    【讨论】:

      【解决方案3】:

      基础R:

      Data$Variables <- rownames(Data)
      

      【讨论】:

      • 您可能还需要执行几个步骤:更改列的顺序,因为这会将新列附加为最后一列,并删除行名称,因为它们不再是包含在 OP 的期望输出中
      猜你喜欢
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 2021-09-29
      • 2021-02-08
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多