【问题标题】:How to address Error: Problem with `filter()` input `..1` with between function error?如何解决错误:`filter()` 输入 `..1` 的问题与函数之间的错误?
【发布时间】:2021-02-03 18:29:04
【问题描述】:

我运行的代码过滤分组的行,因此每个组只剩下 1 行,除非多行通过我的所有过滤器。这段代码昨天已经运行良好。然而,今天我下载了一些新包(用于分析基因富集),由于使用这些包,我的过滤代码现在给了我一个新错误:

SD1<- df %>% 
  group_by(group) %>% 
  filter(if(n() > 1) {(Score > SD) } else TRUE) %>%
  slice_max(count1, n = 1) %>% 
  slice_max(count2, n = 1) 

PPI <- df %>% 
  group_by(group) %>% 
  dplyr::filter(if(n() > 1) {(Score < SD) } else TRUE) %>%
  dplyr::filter(dplyr::between(Score, Average, SD)) %>%
  slice_max(count1, n = 1) %>% 
  slice_max(count2, n = 1) %>% 
  subset(!(group %in% SD1$group)) %>%
  ungroup()

Error: Problem with `filter()` input `..1`.
x `left` must be length 1
i Input `..1` is `dplyr::between(Score, Average, SD)`.
i The error occurred in group 1: group = 1.

我见过类似的问题,但尝试应用他们的答案在我的用例中没有奏效。

出现这种情况是否存在编码原因,或者是 dplyr 与我在 RStudio 中安装的新冲突包存在问题?据我所知,这是我做的唯一不同的事情。

它过滤的数据如下:

group       gene       Score       Average       SD   count1 count2 
1           gene1        0.1                   0.43               0.75                 0                 1
1           gene2        0.5                   0.43               0.75                 0                23
1           gene3        0.7                   0.43               0.75                 1                45
2           gene4        0.88                  0.7                0.75

会话信息:

sessionInfo()
R version 4.0.2 (2020-06-22)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18363)

Matrix products: default

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252   
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] forcats_0.5.1     stringr_1.4.0     purrr_0.3.4       readr_1.4.0       tibble_3.0.6     
 [6] ggplot2_3.3.3     tidyverse_1.3.0   tidyr_1.1.2       dplyr_1.0.3       data.table_1.13.6

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.6        pillar_1.4.7      compiler_4.0.2    cellranger_1.1.0  dbplyr_2.0.0     
 [6] tools_4.0.2       jsonlite_1.7.2    lubridate_1.7.9.2 lifecycle_0.2.0   gtable_0.3.0     
[11] pkgconfig_2.0.3   rlang_0.4.10      reprex_1.0.0      cli_2.3.0         rstudioapi_0.13  
[16] DBI_1.1.1         haven_2.3.1       withr_2.4.1       xml2_1.3.2        httr_1.4.2       
[21] fs_1.5.0          generics_0.1.0    vctrs_0.3.6       hms_1.0.0         grid_4.0.2       
[26] tidyselect_1.1.0  glue_1.4.2        R6_2.5.0          readxl_1.3.1      modelr_0.1.8     
[31] magrittr_2.0.1    backports_1.2.1   scales_1.1.1      ellipsis_0.3.1    rvest_0.3.6      
[36] assertthat_0.2.1  colorspace_2.0-0  stringi_1.5.3     munsell_0.5.0     broom_0.7.4      
[41] crayon_1.4.0   

【问题讨论】:

  • 从示例中,UpperSD_Genes 得到 0 行
  • 对不起,我会更新这个例子——我是当场编的,我会放一个真实的。我认为从例子中gene3应该被我的过滤规则选择了。除此之外,您没有遇到与我相同的错误,这是否意味着我的错误是 dpylr 的问题,而不是运行的代码?
  • 错误出现在最后一步,因为您的数据中没有行

标签: r filter dplyr


【解决方案1】:

错误发生在subset 的最后一步(在tidyverse 中,它与filter 相同)虽然“UpperSD_Genes”数据集显示 0 行,因此无法从该列中提取值

nrow(UpperSD_Genes)
#[1] 0

即它工作正常,直到

df %>% 
   group_by(group) %>% 
   dplyr::filter(if(n() > 1) {(RFR_Score < Upper_SD_Threshold) } else TRUE) %>%     
   dplyr::filter(dplyr::between(RFR_Score, AvgScore_Per_Group, Upper_SD_Threshold)) %>%
   slice_max(direct_PPI_count, n = 1) %>% 
   slice_max(secondary_PPI_count, n = 1) 
# A tibble: 1 x 7
# Groups:   group [1]
#  group gene  RFR_Score AvgScore_Per_Group Upper_SD_Threshold direct_PPI_count secondary_PPI_count
#  <int> <chr>     <dbl>              <dbl>              <dbl>            <int>               <int>
#1     1 gene3       0.7               0.43               0.75                1                  45

另外,OP 代码中的具体错误与betweenleftright 有关,其值为length 1。如果有多个元素,则会引发length 错误.为了规避,我们可以使用first

df %>% 
 group_by(group) %>% 
 dplyr::filter(if(n() > 1) {(RFR_Score < Upper_SD_Threshold) } else TRUE) %>%
 dplyr::filter(dplyr::between(RFR_Score, first(AvgScore_Per_Group), first(Upper_SD_Threshold)) )

【讨论】:

  • 在我的真实数据中,UpperSD_Genes 运行并有 343 行。为什么我发布的错误将问题与使用between() 函数的行联系起来?
  • @DN1 如果能给出具体错误的例子,调试起来会更容易
  • 谢谢,刚刚更新了我的示例,所以 UpperSD_Genes 将有 1 行
  • 非常感谢这成功了!不知道为什么我多次运行这段代码直到现在都没有问题。
猜你喜欢
  • 2021-01-24
  • 2021-08-10
  • 1970-01-01
  • 2021-01-15
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
相关资源
最近更新 更多