我有一个包含多个列的数据框,说它如下所示:
ID percent region
1 5 1
1 8 2
1 10 3
1 100 4
2 20 1
2 6 2
2 9 3
2 1 4
3 9 1
3 78 2
3 56 3
3 99 4
4 1 1
4 1 2
4 8 3
我需要随机化数据集的“百分比”列,但值(和值的顺序)在个体(由ID给出)块中需要相同。 “region”和任何其他列保持原样,只有“percent”应该随机化。一个例子如下:
ID percent region
2 20 1
2 6 2
2 9 3
2 1 4
4 1 1
4 1 2
4 8 3
1 5 1
1 8 2
1 10 3
1 100 4
3 9 1
3 78 2
3 56 3
3 99 4
请注意,ID“%”内的值的顺序保持不变。
答案 0 :(得分:1)
我们可以在其上获取distinct
' ID',sample
,通过与每个sample
d' ID&#进行比较来提取数据集的子集34;并将它们绑定在一起(map_df
)
library(tidyverse)
df1 %>%
distinct(ID) %>%
pull(ID) %>%
sample %>%
map_df(~ df1 %>% filter(ID == .x))
或者更快的选择是split
按ID'然后通过list
sample
重新排列names
元素。 list
并绑定行(bind_rows
)
df1 %>%
split(.$ID) %>%
.[sample(names(.))] %>%
bind_rows
或者我们可以使用与上面相同的方法<{1}}
base R