R Вставить - игнорировать случаи, когда хотя бы один элемент, который я вставляю, равен NA - PullRequest
1 голос
/ 04 мая 2020

У меня есть следующий вектор:

vector1 <- c("A", "B", "C" , NA, NA, "D")

Я хочу применить эту функцию вставки, игнорируя значения NA в vector1

vector2 <- paste("#", vector1, "something", sep = "")

и получить это

vector2 <- c("#Asomething", "#Bsomething" , "#Csomething", NA, NA, "#Dsomething")

Я хочу избежать решений ex-post, использующих sub, где я просто избавляюсь от элементов, содержащих буквы «NA» в строке.

Я видел похожий вопрос: подавление NA в paste () однако там они хотят игнорировать NA и просто вставить #something, тогда как я хочу, чтобы NA отображался.

Ответы [ 3 ]

3 голосов
/ 04 мая 2020

Базовый раствор R:

vector2 <- ifelse(is.na(vector1), NA_character_, paste("#", vector1, "something" ,sep = ""))
2 голосов
/ 04 мая 2020

Вы можете объединить его с ifelse следующим образом:

ifelse(is.na(vector1), NA, paste("#", vector1, "something" ,sep = ""))

Несмотря на то, что это было отмечено как ответ, пожалуйста, также посмотрите ответ @hello_friend, который может быть более подходящим.

1 голос
/ 04 мая 2020

Я думаю, вам нужно использовать sapply() с анонимной функцией.

Пожалуйста, взгляните на следующий код, который делает то, что вы хотите.

vector1 <- c("A", "B" , "C" ,NA_character_ , NA_character_, "D")
vector2 <- sapply( vector1, function( x ) 
  ifelse( is.na( x ), 
          NA_character_, 
          paste("#", x, "something" ,sep = "") ),
  USE.NAMES = FALSE
)
vector2
#> [1] "#Asomething" "#Bsomething" "#Csomething" NA            NA           
#> [6] "#Dsomething"

Создан в 2020-05-04 пакетом Представить (v0.3.0)

...