如何从数据框的一列中的每个值中提取随机数

时间:2019-09-19 09:22:48

标签: r dataframe tidyverse

样本数据

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值中减去0y本身的值之间的随机数。

方法

library(tidyverse)
df <- df %>% mutate(z = y - runif(n=1, min=0, max=y))

问题

随机数只生成一次,然后从所有y值中提取出来,而我想为每个减法生成一个随机数。

我该怎么做?

2 个答案:

答案 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))