我有一个数据框,例如:
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
数据帧,并分别对每个数据帧进行随机排序。但是,由于我的课程人数很多,可能太长太脏了。
答案 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