R中数据框中新列的查找表

时间:2014-01-22 04:49:48

标签: r for-loop dataframe

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

以下是我尝试过的内容:我已将质量代码存储在向量qcIDs中,将字符串存储在另一个向量qcStrings中。然后我循环遍历这些并相应地填充数据框中的新列。像这样:

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方法来接近这个?以上看起来像我的感觉一样笨拙(感觉非常笨拙)?感谢。

3 个答案:

答案 0 :(得分:5)

由于在数据框中最终得到一个因子是最有用的,只需使用给定的参数创建因子。这是一个例子:

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

您创建因子的参数:

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

我没有时间,但它会比任何类型的合并更快。这里没有数据比较,只是对象的重新分类。

答案 1 :(得分:1)

使用data.table

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 

答案 2 :(得分:1)

使用merge的解决方案:

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