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.
Run Code Online (Sandbox Code Playgroud)
我有一个数据集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
Run Code Online (Sandbox Code Playgroud)
其中每行包含 5 个概率,总和为 1。我想从 1:5 的概率 p1:p5 中采样一个名为“P”的数字。但是,运行上面的代码会出现错误“c_across()
只能在 dplyr 动词内部使用”。
使用nsource
as 5,它可以工作
library(dplyr)
nsource <- 5
mydata %>%
rowwise %>%
dplyr::mutate(P = sample(1:nsource, size = 1, replace = TRUE,
c_across(matches('^p\\d+$')))) %>%
ungroup
Run Code Online (Sandbox Code Playgroud)
-输出
# 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
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
补救措施是在仅加载的dplyr::mutate
新会话中指定或执行此操作R
dplyr