r - 如何使用 map_dbl 创建两个变量和过滤器

标签 r purrr

<分区>

我有以下数据

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"

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

enter image description here

如何让它显示如下

enter image description here

最佳答案

我们可以在 base R 中的逻辑矩阵上使用 colMeans,使用 stack

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

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

-输出

                 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

关于r - 如何使用 map_dbl 创建两个变量和过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70745587/

相关文章:

r - 在列表中设置数据框的名称

R dplyr 加入日期范围

R:从函数内部在 globalenv() 中创建环境

r - 突变一个新列,该列是 .row 中差异最小的行的 row_id 列表

r - 如何在 R 中的任意嵌套列表上替换 NULL 值?

r - R 中两个向量中每个向量的 [1, 2, 3, ..., n] 元素的排列和组合

r 比较两个数据框之间的列类型

r - 使用 purrr::map2 (?) 向数据框添加新列

r - 在 purrr::map 函数中获取迭代名称

r - 如何在R中不使用循环快速访问列表列表中的元素? (Googleway 套餐)