根据因素对数据帧行进行混洗

时间:2019-01-18 13:47:13

标签: r dplyr

我有一个数据框,例如:

letter class value
     A     0    55
     B     1    23
     C     1    12
     D     1     9
     E     2    68
     F     2    78
     G     2   187

我想对每个类别中的行进行随机抽样,以将letter与新的随机value(但来自同一类别)相关联。

所需的示例输出:

letter class value
     A     0    55
     B     1    12
     C     1     9
     D     1    23
     E     2   187
     F     2    78
     G     2    68

我用dplyr尝试过类似的东西:

tab %>% group_by(class) %>% sample_n(size=3)

但是此示例每组3行,而我每组没有相同数量的值。

我目前发现的唯一解决方案是为每个类创建n数据帧,并分别对每个数据帧进行随机排序。但是,由于我的课程人数很多,可能太长太脏了。

1 个答案:

答案 0 :(得分:3)

我们可以在行序列(sample)上使用row_number()并根据采样索引重新排列'value'

df1 %>% 
  group_by(class) %>% 
  mutate(value = value[sample(row_number())]) 

或者就像注释中提到的@RonakShah一样,如果我们只有一行,那么使用sample将触发值序列的sample。因此,如果我们直接在“值”上使用sample,则可以使用if/else条件

df1 %>% 
  group_by(class) %>%
  mutate(value = if(n() == 1) value else sample(value, n()))

如果我们要使用sample_n,可以在do内完成

df1 %>% 
   group_by(class) %>%
   do(sample_n(., size = nrow(.)))

注意:我们需要指定nrow而不是n(),因为某些tidyverse特定功能在某些功能(例如mutate/fsummarise/filter/arrange等)内工作,但并未实现与以下功能一起使用sample_n