Size: a a a

R (язык программирования)

2021 March 05

IY

Igor Yegin in R (язык программирования)
Dm Kb
мы с коллегами сделали открытие от которого все немного в удивлении.. при фильтрации по строковому значению всегда за компанию фильтруются NA:
vec <- c(1:3, NA, 5:6) %>%
 as.character()
vec # NA присутствует

enframe(vec) %>%
 filter(value != 5) # NA исчезло

as.data.table(vec) %>%
 .[vec != "5"] # NA исчезло

which(vec != "5") # NA исчезло
Опять эти пайпы... Где нагромождение текста в квадратных скобках?
источник

A

Andrey in R (язык программирования)
Dm Kb
мы с коллегами сделали открытие от которого все немного в удивлении.. при фильтрации по строковому значению всегда за компанию фильтруются NA:
vec <- c(1:3, NA, 5:6) %>%
 as.character()
vec # NA присутствует

enframe(vec) %>%
 filter(value != 5) # NA исчезло

as.data.table(vec) %>%
 .[vec != "5"] # NA исчезло

which(vec != "5") # NA исчезло
почему должно быть иначе?
источник

A

Andrey in R (язык программирования)
указанные операции отбирают - буквально - строки, значения которых не равны "5". Для пропуска мы не можем сказать, что он равен "5", но и что не равен сказать не можем
источник

A

Andrey in R (язык программирования)
и в справке написано Note that when a condition evaluates to NA the row will be dropped, unlike base subsetting with [.
источник

A

Andrey in R (язык программирования)
> vec != "5"
[1]  TRUE  TRUE  TRUE    NA FALSE  TRUE

и далее логическое NA превращается в FALSE.
так что это поведение в base R нелогичное
> vec[vec != "5"]
[1] "1" "2" "3" NA  "6"
источник

PU

Philipp Upravitelev in R (язык программирования)
na вроде не логическое
источник

A

Andrey in R (язык программирования)
> typeof(vec != "5")
[1] "logical"
источник

A

Andrey in R (язык программирования)
внутре у него видать NA_integer_
источник

A

Andrey in R (язык программирования)
суть в том, что пропуском ничего индексировать нельзя и строку для пропуска возвращать не нужно
источник

PU

Philipp Upravitelev in R (язык программирования)
хм. надо кишки смотреть
источник

A

Andrey in R (язык программирования)
ну логический тип - это всегда замаскированные 0 и 1
источник

AP

Aleksandr Pidtykan in R (язык программирования)
Как по мне все логично.
источник

A

Andrey in R (язык программирования)
на самом деле я сам на этом когда-то попался именно из-за привычно неправильного  поведения в base R. Пропуски все-таки нужно отлавливать при помощи is.na()
источник

AP

Aleksandr Pidtykan in R (язык программирования)
Andrey
на самом деле я сам на этом когда-то попался именно из-за привычно неправильного  поведения в base R. Пропуски все-таки нужно отлавливать при помощи is.na()
Надо просто привыкнуть добавлять ' | is.na(x) '
источник

A

Andrey in R (язык программирования)
теперь так и делаю (или с пропусками предварительно справляюсь)
источник

DK

Dm Kb in R (язык программирования)
Ed P
но у вас в первом примере нет никакой фильтрации
as.character() конвертирует в строки, а не фильтрует.
первый - это не пример, а просто создание данных)
источник

DK

Dm Kb in R (язык программирования)
Igor Yegin
Опять эти пайпы... Где нагромождение текста в квадратных скобках?
ну у меня, так скажем, свой стиль)
источник

DK

Dm Kb in R (язык программирования)
Andrey
теперь так и делаю (или с пропусками предварительно справляюсь)
согласен, проверки  на NA - это необходимая стадия при начале работы, да и после после pivot_wider, например, будет не лишним
источник

IY

Igor Yegin in R (язык программирования)
А за что?
источник

S

Stan in R (язык программирования)
Dm Kb
согласен, проверки  на NA - это необходимая стадия при начале работы, да и после после pivot_wider, например, будет не лишним
Для этого лучше воспользоваться хорошими штуками, вроде skimr
источник