使用随机实验更新数据框架中的矢量

时间:2018-03-21 18:32:19

标签: r function dataframe random

我有以下数据框" df1"和" df2":

x1 <- c(1,1,1,2,2,3)
y1 <- c(0,0,1,1,2,2)
df1 <- data.frame(x1,y1)

y <- c(0,1,2)
p <- c(0.1,0.6,0.9)
df2 <- data.frame(y,p)

我想要做的是根据随机实验将df1 $ x1更新为新的矢量df1 $ x2。这可以使用以下功能手动完成,并且&#34; lapply&#34;在矢量df1 $ x1:

example_function <- function(x,p){
   if(runif(1) <= p) return(x + 1)
   return(x)
}

set.seed(123)
df1$x2 <- unlist(lapply(df1$x1,example_function,0.5))

该函数执行随机实验并将其与给定概率p进行比较。根据结果​​,对于df $ x2,x保持不变,或者增加值为1。

在上述程序中,&#34; p&#34;在函数内手动选择(此处为0.5,表示df1中的所有x值)。但是,我希望根据df1 $ x1和df1 $ y1的组合自动选择p。这里有df2发挥作用。 df2显示哪些p值与哪些y值相关。例如,df1 $ x1 [3]等于1,相应的y值df1 $ y1 [3]也等于1.df2表示相关的p值必须为0.6(即y的p值等于1) 。为了确定相应的值df1 $ x2,应该在&#34; example_function&#34;中使用p = 0.6。取决于df1 $ y1,对于df1 $ x1 [1]和df1 $ x1 [2],p应为0.1,对于df1 $ x1 [3]和df1 $ x1 [4]为0.6,对于df1 $ x1 [5]为0.9 DF1 $ X1 [6]。

以下示例是一种方法,但仅当vector df $ x1仅包含不同的值时:

x1 <- c(1,2,3,4,5,6)
y1 <- c(0,0,1,1,2,2)
df1 <- data.frame(x1,y1)
set.seed(123)

df1$x2 <- unlist(lapply(df1$x1, 
                     function(z) {
                       example_function(z, df2$p[df2$y == df1$y1[df1$x1 == z]])
                     }))
df1

   x1 y1 x2
#1  1  0  1
#2  2  0  2
#3  3  1  4
#4  4  1  4
#5  5  2  5
#6  6  2  7

如上所述,使用x1&lt; - c(1,1,1,2,2,3)会导致警告和错误:

x1 <- c(1,1,1,2,2,3)
y1 <- c(0,0,1,1,2,2)
df1 <- data.frame(x1,y1)
set.seed(123)

df1$x2 <- unlist(lapply(df1$x1, 
                     function(z) {
                       example_function(z, df2$p[df2$y == df1$y1[df1$x1 == z]])
                     }))

Error in if (runif(1) <= p) return(x + 1) : argument is of length zero
In addition: Warning message:
In df2$y == df1$y1[df1$x1 == z] :
Error in if (runif(1) <= p) return(x + 1) : argument is of length zero

有没有人知道如何解决这个问题?我非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

使用“合并”似乎是一种解决方案:

df_new <- merge(df1, df2, by.x = 'y1', by.y = 'y')
set.seed(123)
df1$x2 <- mapply(example_function,df1$x1,df_new$p)

> df1
  x1 y1 x2
1  1  0  1
2  1  0  1
3  1  1  2
4  2  1  2
5  2  2  2
6  3  2  4