样本数据
set.seed(123)
df <- data.frame(x = runif(5, 0, 5), y = runif(5,0,5))
x y
1 1.437888 0.2277825
2 3.941526 2.6405274
3 2.044885 4.4620952
4 4.415087 2.7571751
5 4.702336 2.2830737
我想创建一列z
,其中从所有y值中减去0
和y
本身的值之间的随机数。
方法
library(tidyverse)
df <- df %>% mutate(z = y - runif(n=1, min=0, max=y))
问题
随机数只生成一次,然后从所有y值中提取出来,而我想为每个减法生成一个随机数。
我该怎么做?
答案 0 :(得分:2)
如果您使用1,1,1,1,2,2,2,3,3,3,3,3,4,4
,则不会保留随机数:
sapply
要检查
df$z <- sapply(1:nrow(df), function(t) df$y[t] - runif(n=1, min=0, max=df$y[t]))
df
x y z
1 4.3658120 3.4449822 0.33968580
2 3.2087255 0.3607723 0.06576989
3 0.8543368 1.2724004 0.14831275
4 1.0649560 0.2387039 0.04146824
5 3.6421655 2.2787097 1.48823688
答案 1 :(得分:1)
我们可以一起生成所有随机数,然后相减。
library(dplyr)
df %>%
mutate(rand = runif(n=n(), min=0, max=y), z = y - rand)
# x y rand z
#1 1.437888 0.2277825 0.1573306 0.07045192
#2 3.941526 2.6405274 2.1004535 0.54007390
#3 2.044885 4.4620952 0.1098286 4.35226662
#4 4.415087 2.7571751 1.3173671 1.43980793
#5 4.702336 2.2830737 1.7316190 0.55145467
保留rand
列以确认我们每行都有不同的随机数。
在基数R中,我们可以做
transform(df, z = y - runif(nrow(df), min = 0, max = y))