首页 > 解决方案 > 根据一个因素随机播放数据帧行

问题描述

我有一个数据框,例如:

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

我想对每个类中的行进行随机重新采样,以将 a 关联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为每个类创建数据帧,并独立地打乱每个数据帧。但由于我的班级人数很大,可能会太长太脏。

标签: rdplyr

解决方案


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

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

或者正如评论中提到的@RonakShah,如果我们只有一行,那么 usingsample将触发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/arrangeetc)中工作,但它没有实现与一起工作sample_n


推荐阅读