【发布时间】: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 值?顺便说一句,我认为这种行为非常危险,因为许多人会陷入这个陷阱,例如替换值、子集等。
【问题讨论】:
我尝试按值提取行。
col1 <- c("A", "B", "C", NA)
df <- data.frame(col1)
df$col1[col1 == "A"]
控制台中的结果是
> df$col1[col1 == "A"]
[1] "A" NA
但我当然只想要“A”。如何避免 R 选择 NA 值?顺便说一句,我认为这种行为非常危险,因为许多人会陷入这个陷阱,例如替换值、子集等。
【问题讨论】:
即使关系运算符是==,dplyr 中的filter 也会自动删除NA 元素
library(dplyr)
df %>%
filter(col1 == 'A') %>%
pull(col1)
#[1] "A"
或使用来自collapse 的sbt(用于子集)
library(collapse)
sbt(df, col1 == 'A')$col1
#[1] "A"
【讨论】:
collapse 代码,使用%>% 会给出错误:df %>% sbt(col1 == "A")$col1,并以错误结尾:Error in .$sbt(col1 == "A") : 3 arguments passed to '$' which requires 2
使用%in% 为NA 值返回FALSE。
df$col1[col1 %in% "A"]
#[1] "A"
【讨论】:
正如 Markus 在 cmets 中提到的,基本解决方案是:
df$col1[which(df$col1 == "A")]
或者stringr:
str_subset(df$col1, "A")
【讨论】:
你可以使用is.element:
df[is.element(col1,"A"),]
#[1] "A"
或者干脆过滤掉NA:
df[col1 == "A" & !is.na(col1),]
#[1] "A"
【讨论】: