我有以下数据框" 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
有没有人知道如何解决这个问题?我非常感谢任何帮助。
答案 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