2012-07-16 88 views
4

到data.frame列添加特定的值,我有兩個data.frames:通過模式匹配的

pattern <- data.frame(pattern = c("A", "B", "C", "D"), val = c(1, 1, 2, 2)) 

match <- data.frame(match = c("A", "C")) 

我要添加到我的data.frame模式稱爲new_val另一列,併爲其分配「X」來每一行,其中對於列圖案的值是在data.frame匹配否則分配 「Y」

is.element(pattern$pattern, match$match) 

[1] TRUE FALSE TRUE FALSE

所以,所得到的data.frame應該像:

pattern val new_val 
1 A  1 X 
2 B  1 Y 
3 C  2 X 
4 D  2 Y 

我實現了與一個醜陋的for循環做,但我相信這可以在使用花哨的東西一個一個線R命令幾乎完成:-)

有沒有人能幫忙嗎?

非常感謝!

回答

3

我才真正張貼這一點,因爲泰勒說。我也假設match已更名爲mat

pattern$new_val <- c("Y", "X")[(pattern$pattern %in% mat)+1] 
    pattern 
# pattern val new_val 
#1  A 1  X 
#2  B 1  Y 
#3  C 2  X 
#4  D 2  Y 

​​是發現其中圖案的元素是在墊,如果它在墊返回TRUE,FALSE,如果它不是。然後我加1使其數值在1-2的範圍內,以便它可以用於索引。然後,我們使用的指標即自定義矢量c("Y", "X")因爲我們創建的索引始終爲1或2,我們總是能夠抓住感興趣的元素。因此,在這種情況下,如果圖案不在墊子中,我們將抓住「Y」,如果是「X」,則抓住 - 這是您想要的。

+0

做得好機器人安裝! – 2012-07-16 14:25:01

+0

確實!這兩種解決方案都是優秀的R代碼,而且def優於for-loop解決方案。非常感謝! – user969113 2012-07-16 15:33:50

2

這裏有一種方法(我改名爲你的匹配來墊,因爲有一個非常重要的基礎功能命名的比賽,你可以實際使用來解決這個問題;事實上%in%match形式:

pattern <- data.frame(pattern = c("A", "B", "C", "D"), val = c(1, 1, 2, 2)) 
mat <- c("A", "C") 

pattern$new_val <- "Y"       #pre allot everything to be Y 
pattern$new_val[pattern$pattern %in% mat] <- "X" #replace any A or C with an X 
pattern 

PS如果你想要一個襯墊data.table可能會做

如果你想要的東西多一點複雜,你可以使用一個函數從包我工作:

library(qdap) 

#original problem 
pattern$new_val <- text2color(pattern$pattern, list(c("A", "C")), c("X", "Y")) 

#extending it 
#makes D a 5 
text2color(pattern$pattern, list(c("A", "C"), "D"), c("X", 5, "Y")) 

這個功能真的是專門做別的事情,但如果你想抓住它的主要部分,你可以看看源代碼。 「如果你想要一個襯墊data.table可能會做」,我知道這是絕對有可能在底部的一個襯墊

+0

很好的方式來做到這一點!非常感謝:) – user969113 2012-07-16 13:59:33

+0

理論上你可以更新此不要求從GitHub – Dason 2017-07-05 15:07:10