R 如何将数据子集以实现所需的数据混合?
是否有任何R函数选择数据的随机子集以获得所需的混合 例如,我有100行1、2、3和4,每组25%。但相反,我希望通过随机选择理想的最大100行数来实现这一目标,混合比例为20%、20%、35%、25%R 如何将数据子集以实现所需的数据混合?,r,random,R,Random,是否有任何R函数选择数据的随机子集以获得所需的混合 例如,我有100行1、2、3和4,每组25%。但相反,我希望通过随机选择理想的最大100行数来实现这一目标,混合比例为20%、20%、35%、25% set.seed(1) # Create example data frame dat <- data.frame(A = rep(1:4, times = 25), B = c(rep(c("a", "b", "c"), times = 33), "a
set.seed(1)
# Create example data frame
dat <- data.frame(A = rep(1:4, times = 25),
B = c(rep(c("a", "b", "c"), times = 33), "a"),
stringsAsFactors = FALSE)
library(dplyr)
library(purrr)
dat2 <- dat %>%
group_split(A) %>%
map2_dfr(c(0.2, 0.2, 0.35, 0.25), ~sample_frac(.x, .y))
dat2
# # A tibble: 25 x 2
# A B
# <int> <chr>
# 1 1 a
# 2 1 a
# 3 1 a
# 4 1 a
# 5 1 b
# 6 2 c
# 7 2 c
# 8 2 c
# 9 2 a
# 10 2 b
# # ... with 15 more rows
我曾尝试手动削减比例高于所需比例(1和2)的组的数量,但这是无效的
有没有更简单的方法
这一问题的延伸是:
假设我有两列A&B和100行。A的值为1-4,各占25%;B的值为c(“A”、“B”、“c”),各占33%。我如何随机将比例分别为20%、20%、35%、25%的1-4和比例分别为20%、30%、50%的(a、b、c)
A B
1 a
2 b
3 c
4 a
1 b
2 c
3 a
4 b
.....
下面是你的第一个问题。我们可以使用
dplyr
和purrr
中的函数来实现这一点
set.seed(1)
# Create example data frame
dat <- data.frame(A = rep(1:4, times = 25),
B = c(rep(c("a", "b", "c"), times = 33), "a"),
stringsAsFactors = FALSE)
library(dplyr)
library(purrr)
dat2 <- dat %>%
group_split(A) %>%
map2_dfr(c(0.2, 0.2, 0.35, 0.25), ~sample_frac(.x, .y))
dat2
# # A tibble: 25 x 2
# A B
# <int> <chr>
# 1 1 a
# 2 1 a
# 3 1 a
# 4 1 a
# 5 1 b
# 6 2 c
# 7 2 c
# 8 2 c
# 9 2 a
# 10 2 b
# # ... with 15 more rows
set.seed(1)
#创建示例数据帧
dat%
map2_dfr(c(0.2,0.2,0.35,0.25),~sample_frac(.x,.y))
dat2
##A tibble:25 x 2
#A B
#
#11A
#21 a
#31A
#41A
#51B
#6.2 c
#7.2 c
#8.2 c
#9.2 a
#102 b
# # ... 还有15行
这是你的问题2。我们需要计算每个组合的联合概率。在此之后,我们可以应用与问题1类似的代码
set.seed(1)
# Create a larger data frame for demonstration
dat3 <- do.call("rbind", replicate(100, dat, simplify = FALSE))
# Calculate the joint probability
p1 <- c("1" = 0.2, "2" = 0.2, "3" = 0.35, "4" = 0.25)
p2 <- c("a" = 0.2, "b" = 0.3, "c" = 0.5)
p <- as.vector(t(outer(p1, p2)))
dat4 <- dat3 %>%
group_split(A, B) %>%
map2_dfr(p, ~sample_frac(.x, .y))
# Verify the results
dat4 %>%
count(A) %>%
mutate(P = n/nrow(dat4))
# # A tibble: 4 x 3
# A n P
# <int> <int> <dbl>
# 1 1 164 0.197
# 2 2 166 0.199
# 3 3 298 0.358
# 4 4 205 0.246
dat4 %>%
count(B) %>%
mutate(P = n/nrow(dat4))
# # A tibble: 3 x 3
# B n P
# <chr> <int> <dbl>
# 1 a 169 0.203
# 2 b 246 0.295
# 3 c 418 0.502
set.seed(1)
#为演示创建更大的数据框
dat3%
计数(B)%>%
突变(P=n/nrow(dat4))
##tibble:3 x 3
#B n P
#
#1A 169 0.203
#2B2460.295
#3 c 418 0.502
以下是您的第一个问题。我们可以使用dplyr
和purrr
中的函数来实现这一点
set.seed(1)
# Create example data frame
dat <- data.frame(A = rep(1:4, times = 25),
B = c(rep(c("a", "b", "c"), times = 33), "a"),
stringsAsFactors = FALSE)
library(dplyr)
library(purrr)
dat2 <- dat %>%
group_split(A) %>%
map2_dfr(c(0.2, 0.2, 0.35, 0.25), ~sample_frac(.x, .y))
dat2
# # A tibble: 25 x 2
# A B
# <int> <chr>
# 1 1 a
# 2 1 a
# 3 1 a
# 4 1 a
# 5 1 b
# 6 2 c
# 7 2 c
# 8 2 c
# 9 2 a
# 10 2 b
# # ... with 15 more rows
set.seed(1)
#创建示例数据帧
dat%
map2_dfr(c(0.2,0.2,0.35,0.25),~sample_frac(.x,.y))
dat2
##A tibble:25 x 2
#A B
#
#11A
#21 a
#31A
#41A
#51B
#6.2 c
#7.2 c
#8.2 c
#9.2 a
#102 b
# # ... 还有15行
这是你的问题2。我们需要计算每个组合的联合概率。在此之后,我们可以应用与问题1类似的代码
set.seed(1)
# Create a larger data frame for demonstration
dat3 <- do.call("rbind", replicate(100, dat, simplify = FALSE))
# Calculate the joint probability
p1 <- c("1" = 0.2, "2" = 0.2, "3" = 0.35, "4" = 0.25)
p2 <- c("a" = 0.2, "b" = 0.3, "c" = 0.5)
p <- as.vector(t(outer(p1, p2)))
dat4 <- dat3 %>%
group_split(A, B) %>%
map2_dfr(p, ~sample_frac(.x, .y))
# Verify the results
dat4 %>%
count(A) %>%
mutate(P = n/nrow(dat4))
# # A tibble: 4 x 3
# A n P
# <int> <int> <dbl>
# 1 1 164 0.197
# 2 2 166 0.199
# 3 3 298 0.358
# 4 4 205 0.246
dat4 %>%
count(B) %>%
mutate(P = n/nrow(dat4))
# # A tibble: 3 x 3
# B n P
# <chr> <int> <dbl>
# 1 a 169 0.203
# 2 b 246 0.295
# 3 c 418 0.502
set.seed(1)
#为演示创建更大的数据框
dat3%
计数(B)%>%
突变(P=n/nrow(dat4))
##tibble:3 x 3
#B n P
#
#1A 169 0.203
#2B2460.295
#3 c 418 0.502
谢谢!这是可行的,但它大大减少了数据大小。有并没有办法减少最少的数据量?谢谢!这是可行的,但它大大减少了数据大小。有并没有办法减少最少的数据量?