在r中随机化保守的n行数据帧

时间:2017-10-21 04:01:35

标签: r

我遇到的问题如标题中所述。我想将顶部,中间和底部3行随机化。这是一个示例数据帧。

> set.seed(7)
> mydf
   Id Name Score Feedback
1  1   AB    11        P
2  2   AA    12        P
3  3   AC    12        P
4  4   AD    31        P
5  5   AE    13        P
6  6   AF    15        P
7  7   AG     9        F
8  8   AH     8        F
9  9   AI    11        P

我可以独立地获取顶部,中间和最后3行并进行随机化并将它们合并回来,如下所示:

# Take conservative 3 rows from mydf 
  top3 <- head(mydf,3)
  middle3 <- mydf[4:6,]
  tail3 <- tail(mydf,3)
# randomize the rows 
  top3r <- top3[sample(nrow(top3)),]
  middle3r <- middle3[sample(nrow(middle3)),]
  tail3r <- tail3[sample(nrow(tail3)),]
# merge them back 
  mydfr <- rbind(top3r, middle3r, tail3r)
> mydfr
   Id Name Score Feedback
2  2   AA    12        P
1  1   AB    11        P
3  3   AC    12        P
6  6   AF    15        P
4  4   AD    31        P
5  5   AE    13        P
7  7   AG     9        F
8  8   AH     8        F
9  9   AI    11        P

有没有我可以实现同样的目标而不经过拉动n行的手动过程?

谢谢,

2 个答案:

答案 0 :(得分:1)

如果您想使用dplyr,我可以采用以下方法(虽然我喜欢@Gregor的基本解决方案)。

library(dplyr)
set.seed(1)
mydf %>% 
  mutate(grp = rep(1:3, each = 3)) %>%
  group_by(grp) %>%
  sample_n(3)
#> # A tibble: 9 x 5
#> # Groups:   grp [3]
#>      Id  Name Score Feedback   grp
#>   <int> <chr> <int>    <chr> <int>
#> 1     1    AB    11        P     1
#> 2     3    AC    12        P     1
#> 3     2    AA    12        P     1
#> 4     6    AF    15        P     2
#> 5     4    AD    31        P     2
#> 6     5    AE    13        P     2
#> 7     9    AI    11        P     3
#> 8     8    AH     8        F     3
#> 9     7    AG     9        F     3

答案 1 :(得分:1)

这与您的代码基本相同,但没有所有中间变量。

mydf[c(sample(1:3), sample(4:6), sample(7:9)), ]