用R替换“NA”与来自同一行的另一个单元格

时间:2016-02-26 09:39:36

标签: r replace na

这个主题已经在这里开发,但我仍然在努力。

我有以下样本:

shipType   SHIP_TYPE_VF
UNDEFINED           <NA>
CARGO           <NA>
FISHING Passenger Ship
FISHING           <NA>
UNKNOWN           <NA>

 structure(list(shipType = structure(c(3L, 1L, 2L, 2L, 4L), .Label =
 c("CARGO",  "FISHING", "UNDEFINED", "UNKNOWN"), class = "factor"),
 SHIP_TYPE_VF = structure(c(NA,  NA, 1L, NA, NA), .Label = "Passenger
 Ship", class = "factor")), .Names = c("shipType",  "SHIP_TYPE_VF"),
 row.names = c(NA, -5L), class = "data.frame")

我想将df$SHIP_TYPE_VF中的NA替换为df$shipType中的值。

当我使用以下命令时:

 test$SHIP_TYPE_VF[is.na(test$SHIP_TYPE_VF)] <-
 as.character(test$shipType[is.na(test$SHIP_TYPE_VF)])

我有这个:

  
    

警告消息:在[<-.factor*tmp*,is.na(test $ SHIP_TYPE_VF)中,     value = c(NA,:无效因子级别,NA生成

  

我尝试了其他几个选项。我知道2列应该是因素,但即使有因素它也不起作用。

欢迎提供帮助!

2 个答案:

答案 0 :(得分:2)

列是factor类,我们可以将它转换为character类,它应该可以正常工作。发生错误的原因是另一个&#39; shipType&#39;并没有出现在&SHCH_TYPE&#39;。

test[] <- lapply(test, as.character)
i1 <- is.na(test$SHIP_TYPE_VF)
test$SHIP_TYPE_VF[i1] <- test$shipType[i1]  

或者,我们不是转换为character课程,而是更改levels的{​​{1}}以包含&#39; shipType`中的元素

SHIP_TYPE_VF

答案 1 :(得分:0)

您可以尝试ifelse()功能

df$SHIP_TYPE_VF<- ifelse(is.na(df$SHIP_TYPE_VF), as.character(df$shipType), as.character(df$SHIP_TYPE_VF))