【问题标题】:Create unique random group id in R [duplicate]在R中创建唯一的随机组ID [重复]
【发布时间】:2020-11-19 14:50:27
【问题描述】:

我正在尝试在不使用 for 循环的情况下创建一个唯一的、随机分配(无替换)的组 ID。这是据我所知:

library(datasets)
library(dplyr)

data(iris)

iris <- iris  %>% group_by(Species) %>% mutate(id = cur_group_id())

这为每个 iris$Species 提供了一个组 id,但是,我希望组 id 从 c(1,2,3) 随机分配,而不是根据数据集的顺序分配。

任何帮助创建它都会非常有帮助!我确信有办法用 dplyr 做到这一点,但我很难过......

【问题讨论】:

  • 每个人都必须 50 岁吗?或者你们可以有不同的小组规模吗?

标签: r dataframe dplyr


【解决方案1】:

随机排列行,然后根据Species 的出现分配id

library(dplyr)

iris %>%
  slice_sample(n = nrow(.)) %>%
  #sample_n for dplyr < 1.0.0
  #sample_n(n()) %>%
  mutate(id = match(Species, unique(Species)))

【讨论】:

    【解决方案2】:

    这是samplerecode 的方法:

    1. 使用seq_along(unique(id)) 创建一个整数值向量以重新编码。
    2. 使用sample 对适当数量的随机值进行抽样。
    3. 使用setNames 以新的随机值命名ids。
    4. 使用!!! 将名为id 的向量强制放入表达式列表中。
    5. 使用recode 更改值。
    iris  %>%
      group_by(Species) %>%
      mutate(id = cur_group_id()) %>%
      mutate(id = recode(id, !!!setNames(unique(id),
                                         sample(seq_along(unique(id))))))
    
    

    我认为其他答案是更好的方法,但在您的工具包中使用 recode!!! 在其他情况下会有所帮助。

    【讨论】:

      【解决方案3】:

      也许您可以通过添加sample 操作来对group_by 进行一些技巧,例如,

      iris <- iris %>%
        group_by(factor(Species, levels = sample(levels(Species)))) %>%
        mutate(id = cur_group_id())
      

      【讨论】:

        【解决方案4】:

        这是一个创建随机数并对它们进行排名的示例答案。

        library(datasets)
        library(dplyr)
        
        data(iris)
        
        df <- iris %>% 
          group_by(Species) %>%
          mutate(id = runif(1,0,1)) %>% 
          ungroup() %>% 
          mutate(id = dense_rank(id))
        
        df %>% sample_n(10)
        #> # A tibble: 10 x 6
        #>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species       id
        #>           <dbl>       <dbl>        <dbl>       <dbl> <fct>      <int>
        #>  1          4.4         3            1.3         0.2 setosa         3
        #>  2          6.5         3            5.5         1.8 virginica      2
        #>  3          6.3         2.7          4.9         1.8 virginica      2
        #>  4          5           3.6          1.4         0.2 setosa         3
        #>  5          6.3         2.3          4.4         1.3 versicolor     1
        #>  6          7.9         3.8          6.4         2   virginica      2
        #>  7          5.4         3.9          1.7         0.4 setosa         3
        #>  8          5.7         4.4          1.5         0.4 setosa         3
        #>  9          6.4         2.8          5.6         2.2 virginica      2
        #> 10          5.2         3.4          1.4         0.2 setosa         3
        

        reprex package (v0.3.0) 于 2020 年 7 月 29 日创建

        【讨论】:

        • 这是一个绝妙的技巧。我以前从未见过dense_rank。
        猜你喜欢
        • 2020-12-05
        • 1970-01-01
        • 2014-06-05
        • 2011-02-20
        • 1970-01-01
        • 2012-08-26
        • 1970-01-01
        • 1970-01-01
        • 2018-01-05
        相关资源
        最近更新 更多