如何生成一个具有依赖于矩阵/搜索逻辑的值的新列?

时间:2014-12-16 15:10:29

标签: r

我正在尝试生成一个具有依赖于矩阵或解决逻辑的值的列,如下所示。

一些虚拟数据:

SomeDiscreteScale<-c("Black", "Black", "Red", "Green", "Blue", "Blue", "Black")
AccordingValue<-c(1:7)
TemplateData<-data.frame(SomeDiscreteScale, AccordingValue)

分配值的逻辑:

a<-c("Black", "Red", "Green", "Blue")
b<-c(1:4)
SolvingLogic<-data.frame(a,b)

最终输出应如下所示:

solution<-c(1,1,2,3,4,4,1)
solution<-cbind(TemplateData, solution)
solution

我现在正在做的方法是将虚拟数据子集化为离散值(这里是黑色,红色,绿色和蓝色),添加所需的新值,然后再次绑定数据。这当然非常不方便。但是我怎么能这样做更容易?

非常感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用match

 TemplateData$solution <- match(TemplateData$SomeDiscreteScale, SolvingLogic$a)
 TemplateData$solution
 #[1] 1 1 2 3 4 4 1

如果SolvingLogic$b有其他值,例如

 SolvingLogic$b <- letters[c(4,3,7,8)]
 TemplateData$solution <- SolvingLogic$b[match(TemplateData$SomeDiscreteScale,
                           SolvingLogic$a)]

 TemplateData$solution 
 #[1] "d" "d" "c" "g" "h" "h" "d"

答案 1 :(得分:2)

除了match之外,您还可以查看merge(但基本R&#39; s merge有时可能会很慢并且似乎总是对行订单做有趣的事情):

merge(TemplateData, SolvingLogic, by.x = "SomeDiscreteScale", by.y = "a")
#   SomeDiscreteScale AccordingValue b
# 1             Black              1 1
# 2             Black              2 1
# 3             Black              7 1
# 4              Blue              5 4
# 5              Blue              6 4
# 6             Green              4 3
# 7               Red              3 2

答案 2 :(得分:2)

您可以将level参数设置为factor转换为a,然后转换为numeric

transform(TemplateData, solution = as.numeric(factor(SomeDiscreteScale, levels = a)))
#  SomeDiscreteScale AccordingValue solution
#1             Black              1        1
#2             Black              2        1
#3               Red              3        2
#4             Green              4        3
#5              Blue              5        4
#6              Blue              6        4
#7             Black              7        1

以防你的实际&#34; b&#34;查找中的值比1:4更复杂,您仍然可以使用这种方法进行微小的修改:

b <- letters[4:7]  # using some characters for the lookup
transform(TemplateData, solution = b[as.numeric(factor(SomeDiscreteScale, levels = a))])
#  SomeDiscreteScale AccordingValue solution
#1             Black              1        d
#2             Black              2        d
#3               Red              3        e
#4             Green              4        f
#5              Blue              5        g
#6              Blue              6        g
#7             Black              7        d