R +中的模拟和场景有助于功能

时间:2017-03-03 01:20:43

标签: r simulation

假设我有以下内容。

包含输入数据的表

table <- data.frame(id=c(1,2,3,4,5,6),
                      cost=c(100,200,300,400,500,600))

可能的结果列表和关联概率

values<-list(c(1),
             c(0.5),
             c(0))

不同场景的模拟

esc<-sample(1:3,100,replace=T)

如何添加包含下一个公式的新列?

id cost final
1  100  100*ifelse(esc[1]==1,values[[1]],ifelse(esc[1]==2,values[[2]],values[[3]]))
2  200  200*ifelse(esc[2]==1,values[[1]],ifelse(esc[2]==2,values[[2]],values[[3]]))

1 个答案:

答案 0 :(得分:0)

使用esc作为标签,将values变量转换为系数。然后转换为数字类型。这会将values正确映射到esc

esc <- as.numeric ( as.character( factor( esc, levels = sort( unique( esc )), labels = values) ) )
# [1] 1.0 0.5 0.5 0.0 1.0 0.0 0.0 0.5 0.5 1.0 1.0 1.0 0.0 0.5 0.0 0.5 0.0 0.0 0.5 0.0 0.0 1.0 0.5 1.0 1.0 0.5 1.0 0.5 0.0 0.5 0.5 0.5 0.5 1.0 0.0 0.0 0.0
# [38] 1.0 0.0 0.5 0.0 0.5 0.0 0.5 0.5 0.0 1.0 0.5 0.0 0.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.0 1.0 0.5 1.0 0.5 1.0 0.5 0.0 1.0 0.0 0.5 0.0 0.5 0.5
# [75] 0.5 0.0 0.0 0.5 0.0 0.0 0.5 0.0 0.5 1.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 0.0 0.5

table$esc <- esc[ 1: nrow(table) ]   # add esc to table

现在将costesc相乘以获得final

within( table, final <- cost * esc)
#   id cost esc final
# 1  1  100 1.0   100
# 2  2  200 0.5   100
# 3  3  300 0.5   150
# 4  4  400 0.0     0
# 5  5  500 1.0   500
# 6  6  600 0.0     0

数据:

table <- data.frame(id=c(1,2,3,4,5,6), cost=c(100,200,300,400,500,600))
values <- c(1, 0.5, 0)
set.seed(1L)
esc <- sample(1:3,100,replace=T)
esc
# [1] 1 2 2 3 1 3 3 2 2 1 1 1 3 2 3 2 3 3 2 3 3 1 2 1 1 2 1 2 3 2 2 2 2 1 3 3 3 1 3 2 3 2 3 2 2 3 1 2 3 3 2 3 2 1 1 1 1 2 2 2 3 1 2 1 2 1 2 3 1 3 2 3 2 2 2
# [76] 3 3 2 3 3 2 3 2 1 3 1 3 1 1 1 1 1 2 3 3 3 2 2 3 2