Как заменить NA пробелами в paste()?

У меня есть датафрейм

  Fruit  Amount  Price
  Apple    2      20
  Banana   NA     59
  Grapes   NA     NA

Я хочу создать «ключевой» столбец, объединив их с ~ между столбцами. Выход мне нужен -

  1. Яблоко~2~20
  2. Банан~~59
  3. Виноград~~

В настоящее время использую paste(fruit, amount,price, sep="~", collapse=NULL) Но я получаю результаты с NA-

  1. Банан~NA~59
  2. Grapes~NA~NA Любая помощь по любой другой функции, которую можно использовать?

person Aditya Biradar    schedule 09.10.2019    source источник


Ответы (3)


Попробуй это-

output <- paste(fruit, amount,price, sep="~", collapse=NULL)
gsub("NA",'',output)

Входные данные:

fruit <- c('Apple','Banana','Grapes')
amount <- c(100,20,NA)
price <- c(NA,60,10)
person Rushabh Patel    schedule 09.10.2019
comment
Rstudio перестала отвечать после того, как я запустил это. Реальный набор данных содержит более 300 000 строк. Подождал 15 минут, пока он не ответит, когда он, наконец, заработал нормально, однако NA все еще были там. Пустышки не заменили. Интересно, это из-за огромного размера фрейма данных. - person Aditya Biradar; 10.10.2019

Вы можете заменить NAs пустыми строками, а затем работать с этим измененным data.frame

df <- read.table(text = "Fruit Amount Price
Apple 2 20
Banana NA 59
Grapes NA NA", header = TRUE, stringsAsFactors = FALSE)

df[is.na(df)] = ""
apply(df, 1, paste, collapse = "~")

# "Apple~2~20" "Banana~~59" "Grapes~~"  
person Ape    schedule 09.10.2019

Вот решение, которое не требует изменения исходного набора данных или создания дополнительного:

data$key<-apply(data,1,function(x) paste(ifelse(is.na(x),"",x),collapse="~"))

   Fruit Amount Price         key
1  Apple      2    20 Apple~ 2~20
2 Banana     NA    59  Banana~~59
3 Grapes     NA    NA    Grapes~~
person iod    schedule 09.10.2019
comment
Итак, проблема, с которой я столкнулся, заключается в том, что фрейм данных, который я использовал в этой проблеме, является просто фиктивным примером. Настоящий состоит из более чем 15 столбцов, из которых мне нужно выбрать 7 столбцов для объединения таким образом (может быть не последовательным). Количество строк также составляет более 300 000. Использование этой функции объединяет все столбцы, а не определенные. - person Aditya Biradar; 10.10.2019
comment
Это легко, просто замените data внутри apply на data[COLS], где COLS — это вектор строк всех имен столбцов, которые вы хотите объединить. - person iod; 10.10.2019