【问题标题】:Add column to grouped data that assigns 1 to individuals and randomly assigns 1 or 0 to pairs将列添加到分组数据,将 1 分配给个人,并将 1 或 0 随机分配给对
【发布时间】:2020-09-14 20:47:04
【问题描述】:

我有一个数据框...

df <- tibble(
  id = 1:7, 
  family = c("a","a","b","b","c", "d", "e")
  )

家庭最​​多只能包含 2 个成员(所以他们要么是个人,要么是成对的)。

我需要一个新列“随机”,将数字 1 分配给只有一个成员(例如 c、d 和 e)的家庭,并将 0 或 1 随机分配给包含 2 个成员的家庭(示例中的 a 和 b )。

到最后,数据应如下所示(取决于 0/1 的随机分配)...

df <- tibble(
  id = 1:7, 
  family = c("a","a","b","b","c", "d", "e"),
  random = c(1, 0, 0, 1, 1, 1, 1)
  )

我希望能够通过 group_by 和 mutate 的组合来做到这一点,因为我主要使用 Tidyverse。

我尝试了以下方法(但这并不是在家庭中随机分配 0/1)...

df %>%
group_by(family) %>%
  mutate(
   random = if_else(
     condition = n() == 1,
     true = 1,
     false = as.double(sample(0:1,1,replace = T))
   )

【问题讨论】:

    标签: r tidyverse data-wrangling


    【解决方案1】:

    您可以沿家庭组的序列长度进行采样并取答案模2:

    df %>% 
      group_by(family) %>% 
      mutate(random = sample(seq(n())) %% 2)
    #> # A tibble: 7 x 3
    #> # Groups:   family [5]
    #>      id family random
    #>   <int> <chr>   <dbl>
    #> 1     1 a           0
    #> 2     2 a           1
    #> 3     3 b           0
    #> 4     4 b           1
    #> 5     5 c           1
    #> 6     6 d           1
    #> 7     7 e           1
    
    
    

    【讨论】:

      【解决方案2】:

      我们可以使用if/else

      library(dplyr)
      df %>% 
        group_by(family) %>%
        mutate(random = if(n() == 1) 1 else sample(rep(0:1, length.out = n())))
      # A tibble: 7 x 3
      # Groups:   family [5]
      #     id family random
      #  <int> <chr>   <dbl>
      #1     1 a           0
      #2     2 a           1
      #3     3 b           1
      #4     4 b           0
      #5     5 c           1
      #6     6 d           1
      #7     7 e           1
      

      【讨论】:

      • 运行 ``` sample(0:1, n(), replace = TRUE) ``` 本身有时会给出 0、0 或 1、1。我总是需要 0、1 或 1, 0 所以我认为这行不通。
      • 抱歉,我一直按回车不反射!
      • 出于兴趣,为什么这个相同的过程在 ifelse() 或 if_else() 函数中不起作用?其中 n() == 1 是条件,1 是真参数,而 sample(rep(0:1, length.out = n())) 是假参数?
      • @Tom 的问题是在ifelse/if_else 中,所有参数都应该具有相同的长度。因此,您可能需要将返回单个元素的条件复制到 n()
      【解决方案3】:

      另一种选择

      df %>%
        group_by(family) %>%
        mutate(random = 2 - sample(1:n()))
      
      # A tibble: 7 x 3
      # Groups:   family [5]
           id family random
      #   <int> <chr>   <dbl>
      # 1     1 a           1
      # 2     2 a           0
      # 3     3 b           1
      # 4     4 b           0
      # 5     5 c           1
      # 6     6 d           1
      # 7     7 e           1
      

      【讨论】:

        猜你喜欢
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 2019-02-01
        • 2020-05-24
        • 2016-02-29
        • 1970-01-01
        • 2014-08-07
        • 2020-04-02
        相关资源
        最近更新 更多