按照代码的编写方式,您将单个值(随机抽取的结果)分配给整个向量(这称为“向量回收”)。
在这种情况下,最好的解决方案是 Steven Beaupré 的答案,创建一个与 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
Since 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