【问题标题】:Two equivalent commands give different returns in r两个等效的命令在 r 中给出不同的返回
【发布时间】:2022-01-06 12:52:18
【问题描述】:

为什么以下两个命令返回的输出不一样?

x <- sample(0:1, 50, replace = TRUE, prob = c(0.5, 0.5))
  sum(x==1)

sample(0:1, 50, replace = TRUE, prob = c(0.5, 0.5)) %>%
  sum(.==1)

第 2 个命令中的第一个总是给我正确的答案(大约 25),第二个命令返回一个太高的数字,比如 52。 我在这里对管道运算符的理解有什么错误?

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    只需用{} 包装它

    sample(0:1, 50, replace = TRUE, prob = c(0.5, 0.5)) %>%
       {sum(.==1)}
    

    问题在于.==1 被视为第二个参数。如果我们这样做,它可以匹配

    sum(x, x == 1)
    

    在我们使用sample 时,请务必同时指定set.seed

    set.seed(24)
    x <- sample(0:1, 50, replace = TRUE, prob = c(0.5, 0.5))
      sum(x==1)
    
    set.seed(24)
    sample(0:1, 50, replace = TRUE, prob = c(0.5, 0.5)) %>%
       {sum(.==1)}
    

    【讨论】:

    • 谢谢它使用额外的括号。我知道种子,但我更频繁地尝试它,因此知道这不仅仅是巧合,而是我编码错误。
    • @DaveTwickenham 我明白了,我为其他用户添加的那部分,以防他们想要复制
    【解决方案2】:

    您也可以使用 lambda 函数来避免错误:

    set.seed(24)
    sample(0:1, 50, replace = TRUE, prob = c(0.5, 0.5)) |>
      (\(x) sum(x))()
    

    【讨论】:

      【解决方案3】:

      另一种方法是将逻辑操作移至 sample() 函数

      sample(c(0:1) == TRUE, 
             size = 50, 
             replace = TRUE, 
             prob = c(0.5, 0.5)) %>%
        sum
      

      您确实会问为什么 - sum 函数将对它接收到的所有值求和,而不仅仅是第一个向量。当您进行管道传输时,它会将最后一步的输出带到sum(...) 中的第一个参数,因此通过还提供x==1,您提供了两个向量,实质上是sum(x, x==1)。例如,您可以使用sum(c(1,1,1), c(1,1,1))(返回六个,将两个向量中的所有值相加)或在您的代码中看到这一点:

      set.seed(1)
      x <- sample(0:1, 
                  size = 50, 
                  replace = TRUE, 
                  prob = c(0.5, 0.5))
      sum(x, x==1)
      
      set.seed(1)
      sample(0:1, 
             size = 50, 
             replace = TRUE, 
             prob = c(0.5, 0.5)) %>%
        sum(x==1)
      

      此外,如果x &lt;- c(1, 0, 1, 0, 1, 1),那么sum(x, x==1)x %&gt;% sum(x==1) 是有效的

      sum(c(1, 0, 1, 0, 1, 1), as.numeric(c(TRUE, FALSE, TRUE, FALSE, TRUE, TRUE)))       
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多