2014-01-22 83 views
3

我有一个数据帧dat,其中一列dat$QC包含质量代码,为一个整数。我想添加一个新列QS,其中包含描述每行的质量代码的字符串。R中的数据帧中新列的查找表

这是我曾尝试:我已经存储在另一个载体,qcStrings在矢量,qcIDs质量代码和字符串。然后我遍历这些并相应地填充数据框中的新列。像这样:

qcIDs <- c(1,2,3) 
qcStrings <- c('foo', 'bar', 'baz') 
for (ii in 1:length(qcIDs)) { 
    dat$QS[dat$QC == qcIDs[ii]] <- qcStrings[ii] 
} 

我是新来的R和已经阅读往往有解决比for循环问题的更好的方法。有没有更多的R-ISH方法来解决这个问题?上面看起来像我觉得笨拙(感觉很笨拙)吗?谢谢。

回答

4

因为它是最有用的与数据帧的一个因素,以结束,只需创建使用给定的参数的因素。这里有一个例子:

qcIDs <- c(1,2,3) 
qcStrings <- c('foo', 'bar', 'baz') 

使用这些在dat编码因素:

dat$QC <- factor(dat$QC, levels=qcIDs, labels=qcStrings) 
dat 
## QC 
## 1 foo 
## 2 bar 
## 3 baz 
## 4 foo 
## 5 bar 
## 6 baz 

我没有这个时间,但它

(dat <- data.frame(QC=rep(c(1,2,3), 2))) 
## QC 
## 1 1 
## 2 2 
## 3 3 
## 4 1 
## 5 2 
## 6 3 

您的因子创建参数将比任何合并都快。这里没有数据比较,只是对象的重新分类。

+0

它不仅是比合并更好的方式 - 它是正确的方式。我保留我的回答供参考,并作为展示为什么这个答案是正确的。 – topchef

+0

谢谢,正是我寻找的那种答案!我知道我的方式有效,但是觉得用这种语言来说这不是正确的方法。我想要一个回答说“这是我们如何在R中做事”,所以谢谢! –

1

使用data.table包使用merge

require("data.table") 
lkp <- data.table(qcIDs = 1:3, qcStrings = c('foo', 'bar', 'baz')) 
dat <- data.table(QC = rep(1:3, 10e6)) 
setkey(dat,QC) 
setkey(lkp,qcIDs) 

result <- lkp[dat] 

print(result) 

#   qcIDs qcStrings 
#  1:  1  foo 
#  2:  1  foo 
#  3:  1  foo 
#  4:  1  foo 
#  5:  1  foo 
#  ---     
# 29999996:  3  baz 
# 29999997:  3  baz 
# 29999998:  3  baz 
# 29999999:  3  baz 
# 30000000:  3  baz 


system.time(lkp[dat]) 
# user system elapsed 
# 0.63 0.07 0.70 
1

解决方案:

lookupQ = data.frame(qcID=c(1,2,3), QS=c('foo', 'bar', 'baz')) 
mergedDat = merge(dat, lookupQ, by.x="QC", by.y="qcID")