我正在尝试生成一个具有依赖于矩阵或解决逻辑的值的列,如下所示。
一些虚拟数据:
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
我现在正在做的方法是将虚拟数据子集化为离散值(这里是黑色,红色,绿色和蓝色),添加所需的新值,然后再次绑定数据。这当然非常不方便。但是我怎么能这样做更容易?
非常感谢。
答案 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