2012-07-16 89 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