繁体   English   中英

传递给 map_dfr 的向量中的 NA 值

[英]NA values in vectors passed to map_dfr

我正在尝试将向量(每个向量具有不同数量的 NA 值)传递给 map() function 但它返回错误。

我有 N 个数字列和 1 个分类列。 我想将每个数字列的分布与另一个按分类列的值拆分的分布进行比较。 我使用overlapping::overlap()来计算分布的重叠,并将数字列输入map_dfr function 以进行迭代。 例如:

require(overlapping)
require(dplyr)
require(purrr)

set.seed( 1 )
n <- 100
G1 <- sample( 0:30, size = n, replace = TRUE )
G2 <- sample( 0:30, size = n, replace = TRUE, prob = dbinom( 0:30, 31, .55 ))
G3 <- sample( 0:30, size = n, replace = TRUE, prob = dbinom( 0:30, 41, .65 ))
Data <- data.frame(y = G1, x = G2, z = G3, group = rep(c("G1","G2", "G3"), each = n), class = rep(c("C1","C2", "C3"), each = 1)) %>% as_tibble()
Data 

overlap_fcn <- function(.x) {
        ## construct list of vectors
    dist_list <- list(
                "C1" = Data %>% 
                        filter(class == 'C1', !is.na(.x)) %>% 
                        pull(.x), 
                "C2" = Data %>% 
                        filter(class == 'C2', !is.na(.x)) %>% 
                        pull(.x),
                "C3" = Data %>% 
                        filter(class == 'C3', !is.na(.x)) %>% 
                        pull(.x)
                )
## calculate distribution overlaps
    return(
        enframe(
                overlapping::overlap(dist_list)$OV*100
        ) %>% 
        mutate(value = paste0(round(value, 2), "%"),
                class = .x) %>%
        rename(comparison = name, overlap = value) %>%
        relocate(class)
    )

}

overlap_table <- purrr::map_dfr(
  .x = c('y', 'x', "z"),
  .f = ~overlap_fcn(.x))

overlap_table

上述工作按预期工作。 但是,在实践中,我在xyz中都有不同数量的缺失。 我尝试使用.is.na(.x)上的过滤器来解决此问题,但它不起作用。 例如:

Data$x[1:3] <- NA
Data$y[10:20] <- NA
Data$z[100:150] <- NA

overlap_table <- purrr::map_dfr(
  .x = c('x', 'y', "z"),
  .f = ~overlap_fcn(.x))

返回此错误:

Error in density.default(x[[j]], n = nbins, ...): 'x' contains missing values
Error in density.default(x[[j]], n = nbins, ...): 'x' contains missing values
Traceback:
1. purrr::map_dfr(.x = c("x", "y", "z"), .f = ~overlap_fcn(.x))
2. map(.x, .f, ...)
3. .f(.x[[i]], ...)
4. overlap_fcn(.x)
5. enframe(overlapping::overlap(dist_list)$OV * 100) %>% mutate(value = paste0(round(value, 
 .     2), "%"), class = .x) %>% rename(comparison = name, overlap = value) %>% 
 .     relocate(class)   # at line 25-33 of file <text>
6. relocate(., class)
7. rename(., comparison = name, overlap = value)
8. mutate(., value = paste0(round(value, 2), "%"), class = .x)
9. enframe(overlapping::overlap(dist_list)$OV * 100)
10. overlapping::overlap(dist_list)
11. density(x[[j]], n = nbins, ...)
12. density.default(x[[j]], n = nbins, ...)
13. stop("'x' contains missing values")

有人可以帮我吗? 我敢肯定,我错过了一些非常明显的东西; 我只是看不到什么!

在这里, .x是字符 class。 我们可能需要转换为sym并评估 ( !! )

overlap_fcn <- function(.x) {
        ## construct list of vectors
    dist_list <- list(
                "C1" = Data %>% 
                        filter(class == 'C1', !is.na(!! rlang::sym(.x)))  %>% 
                        pull(.x), 
                "C2" = Data %>% 
                         filter(class == 'C2', !is.na(!! rlang::sym(.x))) %>% 
                        pull(.x),
                "C3" = Data %>% 
                        filter(class == 'C3', !is.na(!! rlang::sym(.x)))  %>% 
                        pull(.x)
                )
## calculate distribution overlaps
    return(
        enframe(
                overlapping::overlap(dist_list)$OV*100
        ) %>% 
        mutate(value = paste0(round(value, 2), "%"),
                class = .x) %>%
        rename(comparison = name, overlap = value) %>%
        relocate(class)
    )

}

- 在数据中创建 NA 后进行测试

> purrr::map_dfr(
+   .x = c('x', 'y', "z"),
+   .f = ~overlap_fcn(.x))
# A tibble: 9 × 3
  class comparison overlap
  <chr> <chr>      <chr>  
1 x     C1-C2      98.61% 
2 x     C1-C3      97.46% 
3 x     C2-C3      97.5%  
4 y     C1-C2      95.47% 
5 y     C1-C3      96.22% 
6 y     C2-C3      97.14% 
7 z     C1-C2      90.17% 
8 z     C1-C3      94.9%  
9 z     C2-C3      89.24% 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM