dplyr:变异内的整数采样

斯里兰

我试图在atbl_df生成一列,该列是0或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))

但这似乎不符合我的预期。我生成的字段似乎全为零。这是因为其中的语句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

在过去的几个小时中,我为此感到震惊。知道我的脚本有什么缺陷吗?

山姆·菲克(Sam Firke)

编写代码的方式是为整个向量分配一个值(随机抽取的结果)(这称为“向量循环”)。

在这种情况下,最好的解决方案是史蒂文·博普雷(StevenBeaupré)的答案,它创建一个长度为data.frame的随机向量:

df %>% 
  mutate(pop = sample(0:1, n(), replace = TRUE))

通常,如果您想逐行应用函数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

由于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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章