2014-01-22 55 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")