dplyr:mutate中的整数采样

sri*_*amn 6 r dplyr

我试图生成一个tbl_df0或1的随机整数列.这是我正在使用的代码:

library(dplyr)
set.seed(0)

#Dummy data.frame to test
df <- tbl_df(data.frame(x = rep(1:3, each = 4)))

#Generate the random integer column
df_test = df %>% 
  mutate(pop=sample(0:1, 1, replace=TRUE))
Run Code Online (Sandbox Code Playgroud)

但这似乎并没有像我预期的那样发挥作用.我生成的字段似乎都是零.这是因为内部语句mutate是并行评估的,因此最终使用相同的种子进行第一次随机抽取?

df_test 
Source: local data frame [12 x 2]

   x pop
1  1   0
2  1   0
3  1   0
4  1   0
5  2   0
6  2   0
7  2   0
8  2   0
9  3   0
10 3   0
11 3   0
12 3   0
Run Code Online (Sandbox Code Playgroud)

在过去的几个小时里,我正在打破这个局面.知道我的脚本中有什么缺陷吗?

Sam*_*rke 11

编写代码的方式是,您将整个向量分配一个值(随机抽取的结果)(这称为"向量回收").

在这种情况下,最好的解决方案是StevenBeaupré的答案,创建一个随机化的向量,即data.frame的长度:

df %>% 
  mutate(pop = sample(0:1, n(), replace = TRUE))
Run Code Online (Sandbox Code Playgroud)

通常,如果你想逐行地应用一个函数dplyr- 正如你认为的那样 - 你可以使用rowwise(),虽然在这个例子中它不是必需的.

这是一个例子rowwise():

df2 <- data.frame(a = c(1,3,6), b = c(2,4,5))

df2 %>%
  mutate(m = max(a,b))

  a b m
1 1 2 6
2 3 4 6
3 6 5 6

df2 %>%
  rowwise() %>%
  mutate(m = max(a,b))

  a b m
1 1 2 2
2 3 4 4
3 6 5 6
Run Code Online (Sandbox Code Playgroud)

由于rowwise每个行操作的数据组可能比没有任何分组的数据慢.因此,尽可能使用矢量化函数而不是逐行操作最好.


标杆:

采用的方法rowwise()慢了约30倍:

library(microbenchmark)
df <- tbl_df(data.frame(x = rep(1:1000, each = 4)))
bench <- microbenchmark(
  vectorized = df2 <- df %>% mutate(pop = sample(0:1, n(), replace = TRUE)),
  rowwise = df2 <- df %>% rowwise() %>% mutate(pop = sample(0:1, 1, replace = TRUE)),
  times = 1000
  )

options(microbenchmark.unit="relative")
print(bench)
autoplot(bench)

Unit: relative
       expr      min       lq     mean   median       uq     max neval
 vectorized  1.00000  1.00000  1.00000  1.00000  1.00000  1.0000  1000
    rowwise 42.53169 42.29486 36.94876 33.70456 34.92621 71.7682  1000
Run Code Online (Sandbox Code Playgroud)