R 如何将数据子集以实现所需的数据混合?

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

是否有任何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"),
                  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

谢谢!这是可行的,但它大大减少了数据大小。有并没有办法减少最少的数据量?谢谢!这是可行的,但它大大减少了数据大小。有并没有办法减少最少的数据量?