用R中的查找表中的值替换列

时间:2013-07-01 19:27:06

标签: r merge lookup-tables

我需要替换model中的列ddata的值:

> unique(ddata$model)
[1] "GT-I9001"    "iPhone5,2"    "iPhone3,1"                        
[4] "iPhone4,1"   "GT-I9300"     "Nexus 4"                         
[7] "iPhone2,1"   "VS840 4G"     "HTC One X+"  
...

与查询表中的那些,我导入为

> devices
...
15 iPhone1,1         iPhone 2G,
16 iPhone1,2         iPhone 3G,
17 iPhone2,1         iPhone 3GS,
18 iPhone3,1         iPhone 4,
19 iPhone3,2         iPhone 4,
20 iPhone3,3         iPhone 4,
21 iPhone4,1         iPhone 4S,
22 iPhone5,1         iPhone 5,
23 iPhone5,2         iPhone 5,
...

因此,例如,iPhone4,1变为iPhone4S。如果查找表中没有密钥,我希望保留ddata$model的原始值,例如原始Nexus 4仍为Nexus 4

我尝试使用merge,但我不知道如何解决丢失密钥的情况:

ddata2 = merge(ddata,devices,by="model", all.x=T)

问题是ddata2对于devices中没有条目的值, N / A

2 个答案:

答案 0 :(得分:2)

以下是使用qdap的一种方法:

## key <- readLines(n=9)
## iPhone1,1         iPhone 2G,
## iPhone1,2         iPhone 3G,
## iPhone2,1         iPhone 3GS,
## iPhone3,1         iPhone 4,
## iPhone3,2         iPhone 4,
## iPhone3,3         iPhone 4,
## iPhone4,1         iPhone 4S,
## iPhone5,1         iPhone 5,
## iPhone5,2         iPhone 5,
## 
## library(qdap)
## key <- colSplit(key, "         ")
## 
## ddata <- data.frame(model = c("GT-I9001",    "iPhone5,2",    "iPhone3,1",                        
##     "iPhone4,1",   "GT-I9300",     "Nexus 4",                         
##     "iPhone2,1",   "VS840 4G",     "HTC One X+"))

library(qdap)

ddata$model <- as.character(ddata$model)

ddata$model <- lookup(ddata$model, key, missing =NULL) ## OR
ddata$model <- ddata$model %l+% key

请注意,您的数据难以阅读。请使用dput表示奇数数据集。我也相信最近有一个类似的问题但是找不到它。

答案 1 :(得分:1)

我会像上面一样使用merge,然后按照:

ddata2 <- within( ddata2, model[ is.na(model2) ] <- model[ is.na(model2) ] )

假设设备中的第二列称为model2。