这是假人组
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
因此,这里总是按预期选择蓝色行,但其他行表示第一次运行中选择了所有红色行,第二次运行中所有粉红色和所有红色行均被选中-而不是红色和红色粉红色甚至更少。
我想念什么?或其他更好的方法?
答案 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