#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
ascols <- c('value1', 'value2')
, а затем заменитьNA
.df[, (cols) := lapply(.SD, function(x) replace(x, is.na(x), '')), .SDcols = cols]
`5. да, правильно, мне нужно удалить NA из обоих столбцов, но не из других. это пример фрейма данных, в действительности я не хочу удалять na из всех столбцов