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