代码之家  ›  专栏  ›  技术社区  ›  Adrian

R:错误:`c_cross()`只能在dplyr动词中使用

  •  1
  • Adrian  · 技术社区  · 5 年前
    library(tidyverse)
    nsource <- 5
    mydata <- structure(list(p1 = c(0.153603238035774, 0.251732841184133), 
                             p2 = c(0.0108935803858148, 0.12041117307058), 
                             p3 = c(0.712158280629968, 0.257556345715588), 
                             p4 = c(0.0529741150781822, 0.17690785400165), 
                             p5 = c(0.0703707858702605, 0.193391786028049)), 
                        row.names = 1:2, class = "data.frame")
    
    mydata <- mydata %>% 
      rowwise %>%
      mutate(P = sample(1:nsource, size = 1, replace = TRUE, 
                        prob = c_across(matches('^p\\d+$')))) %>% 
      ungroup
    > Error: `c_across()` must only be used inside dplyr verbs.
    

    我有一个数据集 mydata

             p1         p2        p3         p4         p5
    1 0.1536032 0.01089358 0.7121583 0.05297412 0.07037079
    2 0.2517328 0.12041117 0.2575563 0.17690785 0.19339179 
    

    其中每行包含5个概率,其总和为1。我想从1:5w/概率p1:p5中抽取一个称为“P”的数字。但是,运行上述代码会给我一个错误“ c_across()

    2 回复  |  直到 5 年前
        1
  •  0
  •   akrun    5 年前

    具有 nsource 如图5所示,它是有效的

    library(dplyr)
    nsource <- 5
    mydata %>%
       rowwise %>%
       dplyr::mutate(P = sample(1:nsource, size = 1, replace = TRUE, 
           c_across(matches('^p\\d+$')))) %>%
       ungroup
    

    # A tibble: 2 x 6
         p1     p2    p3     p4     p5     P
      <dbl>  <dbl> <dbl>  <dbl>  <dbl> <int>
    1 0.154 0.0109 0.712 0.0530 0.0704     3
    2 0.252 0.120  0.258 0.177  0.193      4
    

    OP代码的问题可能与 plyr::mutate 掩蔽 dplyr::mutate

    mydata %>% 
    +   rowwise %>%
    +   plyr::mutate(P = sample(1:nsource, size = 1, replace = TRUE, 
    +                     prob = c_across(matches('^p\\d+$'))))
    Error: `c_across()` must only be used inside dplyr verbs.
    Run `rlang::last_error()` to see where the error occurred.
    

    补救办法是具体说明 或者用一种新的方法来做这件事 R 只与 dplyr 加载

        2
  •  0
  •   Anoushiravan R    5 年前

    library(purrr)
    
    mydata %>%
      mutate(P = pmap_int(select(cur_data(), everything()), ~ sample(1:nsource, 1, TRUE, c(...))))
    
             p1         p2        p3         p4         p5 P
    1 0.1536032 0.01089358 0.7121583 0.05297412 0.07037079 3
    2 0.2517328 0.12041117 0.2575563 0.17690785 0.19339179 1