【问题标题】:Removing NULL values from the table从表中删除 NULL 值
【发布时间】:2019-10-11 16:27:03
【问题描述】:

我有一张表,其中有一列中有 NUll 值,这些空值添加到 Highchart 图中的 Extra Label 中。如何使用 Dplyr 操作数据以删除特定列中具有 Null 值的行?

我正在考虑对后端 SQL 查询进行更改,并过滤结果以获得所需的输出。但这不是一个合适的方式。

这行不通,

   dplyr::filter(!is.na(ColumnWithNullValues)) %>%

实际代码:

df <- data() %>%
      dplyr::filter(CreatedBy == 'owner') %>%
      dplyr::group_by(`Reason for creation`) %>%
      dplyr::arrange(ReasonOrder) %>%

ColumnWithNullValues

【问题讨论】:

  • 你有list 专栏吗? NULL 的值是什么,是未引用还是 "NULL"。你能展示一个小示例数据集的dput
  • 未引用,该字段中没有任何内容。
  • 能否显示数据集的str
  • 是 NULL 还是 NA?因为 NULL 不应该以这种方式工作,并且您的代码说 is.na 而不是 is.null
  • 我采用了错误的方法,只需添加 dplyr::filter( ColumnWithALLValues != 'NULL') 就可以了

标签: r dplyr tidyverse


【解决方案1】:

这是base R的一个选项

df[!sapply(df$ColumnWithNullValues, is.null),]

数据

library(tibble)
df <- tibble(
  ColumnWithNullValues = list(c(1:5), NULL, c(6:10)))

【讨论】:

  • 我正在尝试考虑sapply(df$ColumnWithNullValues, is.null) 是否有可能返回不正确的值。列表中的元素是否可能包含 NULL 和合法值?这就是我回答中all(is.null(x)) 的原因,但我不确定这是否重要。
  • @JBGruber 如果元素的类型为vector,则不可能删除NULL。一种选择是拥有listlist 列,但不确定OP 是否是这种情况
  • 太棒了。即使有 listlist 似乎也没有问题。
【解决方案2】:

这是一个小例子 df:

library(dplyr)
library(purrr)
df <- tibble(
  ColumnWithNullValues = list(c(1:5), NULL, c(6:10))
)
df
#> # A tibble: 3 x 1
#>   ColumnWithNullValues
#>   <list>              
#> 1 <int [5]>           
#> 2 <NULL>              
#> 3 <int [5]>

在这种情况下,最合乎逻辑的用法似乎是:

df %>% 
  filter(!is.null(ColumnWithNullValues))
#> # A tibble: 3 x 1
#>   ColumnWithNullValues
#>   <list>              
#> 1 <int [5]>           
#> 2 <NULL>              
#> 3 <int [5]>

但正如您所见,这行不通。相反,我们需要使用 map/sapply/vapply 进入列表。比如这样:

df %>% 
  filter(map_lgl(ColumnWithNullValues, function(x) !all(is.null(x))))
#> # A tibble: 2 x 1
#>   ColumnWithNullValues
#>   <list>              
#> 1 <int [5]>           
#> 2 <int [5]>

但正如@akrun hast 在评论中解释的那样,列表中的元素不可能包含NULL 以及其他值。所以我们可以把代码简化成这样:

df %>% 
  filter(!map_lgl(ColumnWithNullValues, is.null))
#> # A tibble: 3 x 1
#>   ColumnWithNullValues
#>   <list>              
#> 1 <int [5]>           
#> 2 <int [5]>

【讨论】:

    猜你喜欢
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多