【问题标题】:Selection of argument within a function based on the comparison of two vectors基于两个向量的比较选择函数内的参数
【发布时间】:2018-03-21 10:34:57
【问题描述】:

Given 是一个带有向量 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

这是我的问题:在上面的示例中,我为参数“p”(手动)选择了 0.5。相反,我想根据 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 相关联。在这种情况下,“example_function”中 df1$x1[3] 的参数 p 应该是 0.6。如何将这种对值 p 的查询集成到所描述的函数中?

【问题讨论】:

  • 能否分享df1$x2的所需输出?
  • @Antonis,所需的输出是“example_function”中随机实验的结果。输出应该代表向量 x1 到 x2 的更新,其中 x1 到 x2 的变化是随机实验和给定概率的结果。
  • @C.F,关键是更多关于堆栈溢出的编码示例是通过提供示例数据和所需结果的示例来解决的,而不是通过描述来解决。此外,创建示例输出的行为加强了对需求的描述。如果存在随机性,设置种子使其可重现。

标签: r function arguments comparison matching


【解决方案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  

【讨论】:

  • 感谢您的帖子,此解决方案非常适合我上面的示例。这正是我想要的。但是,如果向量 x1 包含几个相等的值(例如 x1
  • 编辑以添加索引 [1]。注意:我还没有实际测试过这个变化,但是因为一切都是向量,所以你可以选择任何重复项中的第一个(假设这是你的规则)
  • 感谢您的编辑,乍一看,这似乎有效。但是这种方法意味着 x 的每个相同值都有相同的概率,对吧?但是,也有相同的 x 值,它们具有不同的 y 值,因此也有不同的 p 值。例如,对于 df1:“x1
  • 补充:在我上面评论的示例中,x1[1] = 1 属于 y1[1] = 5。y1 的 5 意味着 p = 0.2。另一方面,x1[2] 也是 = 1,但属于 y1[2] = 6。这意味着 p = 0.9。
【解决方案2】:

这里不需要做任何复杂的事情。你可以使用向量表达式得到你想要的。

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

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

然后从x1 中选择您的x2 和这样的示例:

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

【讨论】:

    【解决方案3】:

    解决问题的一种方法是使用“merge”和“mapply”而不是“lapply”:

    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  2  1  3
    4  2  1  2
    5  3  2  3
    6  4  2  5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 2021-07-24
      • 2010-11-26
      • 2011-06-04
      • 2013-03-15
      • 2013-03-25
      • 1970-01-01
      相关资源
      最近更新 更多