簡體   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