R-Randomize列根据另一列中的ID

时间:2018-04-20 03:30:43

标签: r

我有一个包含多个列的数据框,说它如下所示:

 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“%”内的值的顺序保持不变。

1 个答案:

答案 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