Пример данных, которые я использую, чтобы попробовать это.
df <- data.frame(c1=c(NA,NA,NA,NA,NA,NA,'Account','Liability','NA'), c2=c('FY','Period','Category','Currency','Location','Entity','Product','Prod1','Prod2'),
c3=c('2022','Jan','Group','FX','Location','AUS','*1000',35,45),
c4=c(NA,NA,NA,NA,NA,'Brunei','*1000',20,56))
Когда я пытаюсь получить строки, которые являются NA в первом столбце, это работает
df %>% select(.,1) %>% is.na()
но если я хочу получить не-NA, то добавлю ! до того, как NA не сработает
df %>% select(.,1) %>% !is.na()
Я полагаю, это потому, что !is.na( сама по себе не является функцией.
Хотя !(df %>% select(.,1) %>% is.na())
дает мне результат, это не помогает мне добавлять больше каналов и операций. Может кто-нибудь, пожалуйста, скажите мне, есть ли способ обойти это?
@RitchieSacramento благодаря тебе я сегодня узнал кое-что важное. Не знал о правиле первого аргумента
Этот пример был бы проще в базе R: !is.na(df[1])
Одним из вариантов было бы разделить вашу операцию на два этапа, например, где вы должны обернуть !
обратными кавычками. Также обратите внимание, что при использовании select
, который возвращает df, применение is.na()
возвращает матрицу. Возможно, вы хотите pull
?
library(dplyr, w = FALSE)
df %>% select(1) %>% is.na() %>% `!`
#> c1
#> [1,] FALSE
#> [2,] FALSE
#> [3,] FALSE
#> [4,] FALSE
#> [5,] FALSE
#> [6,] FALSE
#> [7,] TRUE
#> [8,] TRUE
#> [9,] TRUE
df %>% pull(1) %>% is.na() %>% `!`
#> [1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
И второй вариант — использовать purrr::negate
вот так:
df %>% select(1) %>% purrr::negate(is.na)(.)
#> c1
#> [1,] FALSE
#> [2,] FALSE
#> [3,] FALSE
#> [4,] FALSE
#> [5,] FALSE
#> [6,] FALSE
#> [7,] TRUE
#> [8,] TRUE
#> [9,] TRUE
df %>% pull(1) %>% purrr::negate(is.na)(.)
#> [1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
Пожалуйста. Но, возможно, самым простым подходом было бы завернуть внутрь {}
, как упоминал Ричи в своем комментарии.
Используйте фигурные скобки, чтобы запретить правило первого аргумента, например.
{!is.na(.)}
.