2015-04-17 2 views
1

Я объединил две таблицы данных. В результате у меня есть два столбца фактора model (с использованием пользовательских суффиксов - model.p и model.a). Теперь я хотел бы переместить model.a значение в столбцы model.p, если model.p столбцы пустые (то есть равные NA) и model.a значение не NA.Как заменить значения NA в одном столбце значениями из другого столбца?

Вот что я пробовал:

zz1 <- "or,d,ddate,rdate,changes,class,price,fdate,company,number,minutes,model,added,source 
VA1,VA2,2014-05-24,,0,0,2124,2014-05-22 15:50:16,,B3970,,,2014-05-22 12:20:03,ss 
VA1,VA2,2014-05-26,,0,0,2124,2014-05-22 15:03:44,,B1234,,A1,2014-05-22 12:20:03,s1 
VA1,VA2,2014-06-05,,0,0,2124,2014-05-22 15:48:24,,,,,2014-05-22 12:20:03,s1 
VA1,VA2,2014-06-09,,0,0,2124,2014-05-22 15:37:35,,,,,2014-05-22 12:20:03,s2 
VA1,VA2,2014-06-16,,0,0,2124,2014-05-22 14:17:33,,,,,2014-05-22 12:20:03,ss" 

zz3 <- "number,ddate,model,model_id 
B3970,2014-05-24,320,AB-DVH 
B1234,2014-05-26,319,BA-DVH 
" 

columnClasses <- c("factor", "factor", "POSIXct", "factor", "integer", "factor", "integer", "factor", "factor", "factor", "integer", "factor", "factor", "factor") 
dt1 <- read.table(text=zz1, header = TRUE, sep = ",", na.strings = c(""), colClasses = columnClasses) 

columnClasses <- c("factor", "POSIXct", "factor", "factor") 
dt3 <- read.table(text=zz3, header = TRUE, sep = ",", comment.char = "", quote = "", na.strings = c(""), colClasses = columnClasses) 

dt13 <- merge(dt1, dt3, by = c("number", "ddate"), all.x = TRUE, suffixes = c(".p", ".a")) 

dt13$model.p <- as.character(dt13$model.p) 
dt13$model.a <- as.character(dt13$model.a) 

dt13$model.p[is.na(dt13$model.p) & !is.na(dt13$model.a)] <- dt13$model.a[is.na(dt13$model.p) & !is.na(dt13$model.a)] # (1) 

dt13$model.a <- NULL 
setnames(dt13, "model.p", "model") 

Похоже, что я делаю что-то неправильно (не нравится линия (1) - я должен иметь такое же условие дается дважды?). Есть ли способ упростить это?

+0

Можете ли вы, возможно, принять ответ для того, чтобы отметить вопрос, как решить? – MERose

ответ

2

Вы можете сделать:

dt13$model.p = with(dt13, ifelse(is.na(model.p) & !is.na(model.a), model.a, model.p) 
0

Я видел этот вопрос видимого на data.table теге, также вы использовали setnames, который data.table функции. Таким образом, вы оставите решение data.table довольно простым.

library(data.table) 
DT1 <- as.data.table(dt1)[, model := as.character(model)] 
DT3 <- as.data.table(dt3)[, model := as.character(model)] 
setkeyv(DT1, c("number", "ddate")) 
setkeyv(DT3, c("number", "ddate")) 
DT1[DT3, `:=`(model_id = i.model_id, model = ifelse(is.na(model),i.model,model))][] 
#  or d  ddate rdate changes class price    fdate company number minutes model    added source model_id 
# 1: VA1 VA2 2014-06-05 NA  0  0 2124 2014-05-22 15:48:24  NA  NA  NA NA 2014-05-22 12:20:03  s1  NA 
# 2: VA1 VA2 2014-06-09 NA  0  0 2124 2014-05-22 15:37:35  NA  NA  NA NA 2014-05-22 12:20:03  s2  NA 
# 3: VA1 VA2 2014-06-16 NA  0  0 2124 2014-05-22 14:17:33  NA  NA  NA NA 2014-05-22 12:20:03  ss  NA 
# 4: VA1 VA2 2014-05-26 NA  0  0 2124 2014-05-22 15:03:44  NA B1234  NA A1 2014-05-22 12:20:03  s1 BA-DVH 
# 5: VA1 VA2 2014-05-24 NA  0  0 2124 2014-05-22 15:50:16  NA B3970  NA 320 2014-05-22 12:20:03  ss AB-DVH 
Смежные вопросы