R 根据因子洗牌数据帧行

R 根据因子洗牌数据帧行,r,dplyr,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 class value A 0

我有一个数据框,例如:

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 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%>%groupby(class)%>%sample(size=3)

但是这个示例每个组有3行,我没有相同数量的值


目前我找到的唯一解决方案是为每个类创建
n
数据帧,并独立地洗牌每个数据帧。但是由于我的类号很大,它可能太长太脏。

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

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/fsummerse/filter/arrange
等,但它不能与
sample\n
Try
df1%>%groupby(class)%>%mutate(value=value[sample]一起工作(row_number())]
@RonakShah在预期输出中不是
55
是的,但是当
sample
中只有一个数字时,它就像
sample(1:55,1)
好的,我在注释中检查了我以前的解决方案。谢谢