基于列值和概率的随机行选择

时间:2018-07-29 20:12:15

标签: r dataframe random subset

这是假人组

df <- data.frame(matrix(rnorm(80), nrow=40))
df$color <-  rep(c("blue", "red", "yellow", "pink"), each=10)


1                   -1.22049503   blue
2                    1.61641224   blue
3                    0.09079087   blue
4                    0.32325956   blue
5                   -0.62733486    red
6                    0.43102051    red
7                    0.61619844    red
8                   -0.17718356    red
9                    1.18737562 yellow
10                  -0.19035444 yellow
11                  -0.49158052 yellow
12                  -1.47425432 yellow
13                   0.22942192   pink
14                   0.76779548   pink
15                   0.97631652   pink
16                  -0.33513712   pink

我要获取的内容是,如果df $ color是蓝色,则将选择那些行,但是如果df $ color是蓝色,则如果df $ color是黄色,则获得该行的可能性更高那么选择该行的可能性就较小,如果df $ color是粉红色,那么选择该行的可能性就很小

这就是我想出的

my.data.frame <- df[(df$color == 'pink') | (df$color == 'blue') & runif(1) < .6 | (df$color == 'red') & runif(1) < .6|(df$color == 'yellow') & runif(1) < .3, ]

但这是两次运行的输出

1                   -1.22049503  blue
2                    1.61641224  blue
3                    0.09079087  blue
4                    0.32325956  blue
13                   0.22942192  pink
14                   0.76779548  pink
15                   0.97631652  pink
16                  -0.33513712  pink

第二次运行

1                   -1.22049503  blue
2                    1.61641224  blue
3                    0.09079087  blue
4                    0.32325956  blue
5                   -0.62733486   red
6                    0.43102051   red
7                    0.61619844   red
8                   -0.17718356   red
13                   0.22942192  pink
14                   0.76779548  pink
15                   0.97631652  pink
16                  -0.33513712  pink

因此,这里总是按预期选择蓝色行,但其他行表示第一次运行中选择了所有红色行,第二次运行中所有粉红色和所有红色行均被选中-而不是红色和红色粉红色甚至更少。

我想念什么?或其他更好的方法?

2 个答案:

答案 0 :(得分:1)

使用tidyverse方式

library(purrr)
library(dplyr)
library(tidyr)

Sample_df <- df %>%
   group_by(color) %>%   
   nest() %>%              
   mutate(Prob = c(.8, .6, .4, .2), samp = map2(data, Prob, sample_frac)) %>%
   select(color, samp) %>% unnest()

答案 1 :(得分:0)

我相信每组颜色仅产生一个runif时您会犯错。接下来,我一步一步地进行操作,以使代码更加清晰。

然后我首先设置RNG种子。

set.seed(4287)    # make the results reproducible

df <- data.frame(matrix(rnorm(80), nrow=40))
df$color <-  rep(c("blue", "red", "yellow", "pink"), each=10)

现在选择。

n <- nrow(df)

blue <- df$color == 'blue'
red <- df$color == 'red'
yellow <- df$color == 'yellow'
pink <- df$color == 'pink'

inx1 <- (blue | red) & runif(n) < 0.6
inx2 <- yellow & runif(n) < 0.3
inx3 <- pink & runif(n) < 0.1

df[inx1 | inx2 | inx3, ]
#            X1         X2  color
#1  -0.85857648  1.0293620   blue
#4  -0.57829575  0.8344532   blue
#5  -0.48677993  1.2926264   blue
#6  -1.43502687 -0.1426327   blue
#7   1.30722272  0.4138376   blue
#8  -1.31555715  0.9674004   blue
#9  -2.00829490 -0.4191471   blue
#12 -0.04129173 -0.3498928    red
#14  0.44029645 -1.2079088    red
#16 -1.45220640  1.9970560    red
#18 -0.63078352 -0.0219340    red
#19 -0.34640599 -0.6622532    red
#20  0.48505620  0.4545426    red
#22 -1.54078662 -0.4094573 yellow
#26 -0.92234468  1.7194836 yellow
#29 -0.19507474 -0.1937266 yellow
#34  0.19274923  0.7879300   pink
#35  0.43921280 -0.9091608   pink
#37 -0.20192350 -0.5766637   pink