【问题标题】:How to subset data to achieve desired data mix?如何对数据进行子集化以实现所需的数据混合?
【发布时间】:2019-09-05 22:45:26
【问题描述】:

是否有任何 R 函数可以选择数据的随机子集以获得所需的混合?

例如,我有 100 行 1、2、3 和 4,每组占 25%。但相反,我希望通过随机选择理想的 100 行的最大数量来实现这一目标,例如 20%、20%、35%、25%。

我尝试手动减少比例高于所需比例(1 和 2)的组的数量,但这效率不高。

有没有更简单的方法?

这个问题的延伸是: 假设我有两列 A & B 和 100 行。 A 的值是 1 - 4,各占 25%,B 的 c("a", "b", "c") 各占 33%。我如何随机子集有 1-4 的比例分别为 20%、20%、35%、25% 和 (a,b,c) 的比例分别为 20%、30%、50%?

A  B
1  a
2  b
3  c
4  a
1  b
2  c
3  a
4  b
.....

【问题讨论】:

    标签: r random


    【解决方案1】:

    以下是您的第一个问题。我们可以使用dplyrpurrr 中的函数来实现这一点。

    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
    

    这是针对您的问题 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
    

    【讨论】:

    • 谢谢!这有效,但它大大减少了数据大小。有没有办法减少最小数据量?
    猜你喜欢
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多