Как игнорировать NA при вставке столбцов с использованием data.table?

#r #dataframe #join #data.table #paste

#r #фрейм данных #Присоединиться #data.table #вставить

Вопрос:

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

 ID   value1  value2
1     wad     11
2     NA      NA
3     elf     1
 

Когда я делаю это:

 dt[,new:=paste0(value1, value2)]
 

Я получаю:

 ID   value1  value2   new
1     wad     11      wad11
2     NA      NA      NANA
3     elf     1       elf1
 

Как игнорировать NA? И удалить значение1 и значение2? Я хочу получить:

 ID   new
1    wad11
2    NA
3    elf1
 

Ответ №1:

Опция data.table

 setDT(df)[,
  .(ID, new = do.call(paste, c(replace(.SD, is.na(.SD), ""), sep = ""))),
  .SDcols = patterns("^value")
]
 

дает

    ID   new
1:  1 wad11
2:  2
3:  3  elf1
 

Данные

 > dput(df)
structure(list(ID = 1:3, value1 = c("wad", NA, "elf"), value2 = c(11L,
NA, 1L)), class = "data.frame", row.names = c(NA, -3L))
 

Ответ №2:

Мы можем сделать

 library(dplyr)
df %>%
   transmute(ID, new = case_when(is.na(value1) amp; is.na(value2) ~ "",
      TRUE ~str_c(value1, value2, sep='_')))
#  ID    new
#1  1 wad_11
#2  2       
#3  3  elf_1
 

Ответ №3:

С data.table :

 library(data.table)       
setDT(df)
df[is.na(df)] <- ''
df[, new := paste0(value1, value2)][, .(ID, new)]
 

tidyr::unite есть однолинейное решение для этого :

 tidyr::unite(df, new, value1, value2, na.rm = TRUE)

#  ID    new
#1  1 wad_11
#2  2       
#3  3  elf_1
 

Комментарии:

1. спасибо, я написал вопрос, используя data.table

2. @reredf я обновил ответ data.table .

3. спасибо, здесь df[is.na (df)] <- » вы удаляете NA из всего фрейма данных, однако мне нужно удалить его только из столбца «value1»

4. А как насчет value2 столбца? Вы хотите сохранить то NA , что есть? Вы можете определить cols as cols <- c('value1', 'value2') , а затем заменить NA . df[, (cols) := lapply(.SD, function(x) replace(x, is.na(x), '')), .SDcols = cols] `

5. да, правильно, мне нужно удалить NA из обоих столбцов, но не из других. это пример фрейма данных, в действительности я не хочу удалять na из всех столбцов