2015-08-21 257 views
1

变量Recence_Connexion_Jrs由“NA”和一些数字(从1到100)组成,我试图使“NA”等于“不打开”,并且也将这些数字分成3组,并且组的标签是字符串的类型。 例如:R:将数字数据和NA转换为字符串

Recence_Connexion_Jrs   Connexion 
     NA       No open 
     NA       No open 
     NA       No open 
     1      connexion 0-7 
     10      connexion 7-30 

,我使用的代码:

setDT(newdata)[!duplicated(newdata),Connexion:=ifelse(is.na(Recence_Connexion_jrs), 
"No Open",cut(Recence_Connexion_jrs,breaks=c(-Inf,7,30,+Inf), 
labels=c("connexion 0-7","connexion 7-30","connexion 30+")))] 

,但它给了错误的结果。

我该如何解决呢?

+0

请提供一个可重复的例子,包括输入和期望的输出。 – Heroka

+1

[阅读关于如何给出一个可重复的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – Jaap

+0

我认为有''' 'setDT(newdata' – Jaap

回答

3

我建议分两步进行:(1)使用cut(如上所述);(2)使用replace作为NA的值。

下面是一个向量的例子。没有理由你不能做类似的事情在data.table

set.seed(123) 
vec <- sample(c(1:40, NA), 100, TRUE) 
new <- cut(vec, c(-Inf, 7, 30, +Inf), 
      labels=c("connexion 0-7", "connexion 7-30", "connexion 30+")) 
new <- replace(as.character(new), is.na(new), "No open") 

或者,在一个小data.table给你看更轻松:

library(data.table) 
DT <- data.table(vec = c(1, NA, 8, 20, NA, 32)) 
DT[, new := as.character(
    cut(vec, c(-Inf, 7, 30, +Inf), 
     labels = c("connexion 0-7", "connexion 7-30", "connexion 30+")))][ 
     , new := replace(new, is.na(new), "No open") 
     ][]  
# vec   new 
# 1: 1 connexion 0-7 
# 2: NA  No open 
# 3: 8 connexion 7-30 
# 4: 20 connexion 7-30 
# 5: NA  No open 
# 6: 32 connexion 30+