我遇到的问题如标题中所述。我想将顶部,中间和底部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行的手动过程?
谢谢,
答案 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)), ]