基于两个向量的比较选择函数内的参数

时间:2018-03-21 10:34:58

标签: r function arguments comparison matching

给定是具有向量x1和y1的数据帧:

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

另外,我有一个数据框,其中包含来自向量y1的不同值和相应的概率:

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

以下函数将给定概率(p)与随机数(runif(1))进行比较。根据比较结果,df $ x1的值发生变化并存储在df $ x2中(对于每个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))

> df1$x2
[1] 2 1 3 2 3 5

这是我的问题:在上面的示例中,我为参数选择了0.5&#34; p&#34; (手动地)。相反,我想根据df1中与x1相关的y1值从df2中选择概率p。因此,我想要p in

df1$x2 <- unlist(lapply(df1$x1,example_function,p))

来自df2。

例如,df $ x1 [3]是2,属于df $ y1 [3],它是1. df2表示,y的1与p = 0.6相关联。在这种情况下,&#34; example_function&#34;中的df1 $ x1 [3]的参数p应该是0.6。如何将值p的这种查询集成到所描述的函数中?

3 个答案:

答案 0 :(得分:1)

这里没有必要做任何复杂的事情。你可以使用vector-expressions获得你想要的东西。

要选择py1给出的概率,只需下标:

> p[y1]
[1] 0.1 0.1 0.6 0.6

然后从x2选择您的x1,并选择以下示例:

> ifelse(runif(1) <= p[y1], x1, x1 + 2)
[1] 3 4 3 4

答案 1 :(得分:1)

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

df1

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

答案 2 :(得分:0)

解决问题的一种方法是使用&#34; merge&#34;和&#34; mapply&#34;而不是&#34; lapply&#34;:

MyService myServiceMock = Mockito.mock(MyService.class);
Application application = (Application) ShadowApplication.getInstance().getApplicationContext();
ShadowContextImpl shadowContext = (ShadowContextImpl) Shadows.shadowOf(application.getBaseContext());
shadowContext.setSystemService(Context.MY_SERVICE, myServiceMock);