【问题标题】:R Selection by value, avoid NAR 按值选择,避免 NA
【发布时间】:2021-06-17 09:01:15
【问题描述】:

我尝试按值提取行。

col1 <- c("A", "B", "C", NA)
df <- data.frame(col1)
df$col1[col1 == "A"]

控制台中的结果是

> df$col1[col1 == "A"]
[1] "A" NA

但我当然只想要“A”。如何避免 R 选择 NA 值?顺便说一句,我认为这种行为非常危险,因为许多人会陷入这个陷阱,例如替换值、子集等。

【问题讨论】:

    标签: r dataframe subset na


    【解决方案1】:

    即使关系运算符是==dplyr 中的filter 也会自动删除NA 元素

    library(dplyr)
    df %>%
       filter(col1 == 'A') %>% 
       pull(col1)
    #[1] "A"
    

    或使用来自collapsesbt(用于子集)

    library(collapse)
    sbt(df, col1 == 'A')$col1
    #[1] "A"
    

    【讨论】:

    • 有趣的是,对于所提供的collapse 代码,使用%&gt;% 会给出错误:df %&gt;% sbt(col1 == "A")$col1,并以错误结尾:Error in .$sbt(col1 == "A") : 3 arguments passed to '$' which requires 2
    【解决方案2】:

    使用%in%NA 值返回FALSE

    df$col1[col1 %in% "A"]
    #[1] "A"
    

    【讨论】:

      【解决方案3】:

      正如 Markus 在 cmets 中提到的,基本解决方案是:

      df$col1[which(df$col1 == "A")]
      

      或者stringr:

      str_subset(df$col1, "A")
      

      【讨论】:

        【解决方案4】:

        你可以使用is.element:

        df[is.element(col1,"A"),]
        #[1] "A"
        

        或者干脆过滤掉NA:

        df[col1 == "A" & !is.na(col1),]
        #[1] "A"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-26
          • 2022-01-22
          • 1970-01-01
          • 2012-09-20
          相关资源
          最近更新 更多