【问题标题】:Permutate column values between group levels在组级别之间排列列值
【发布时间】:2026-01-20 07:05:02
【问题描述】:

我有一个数据框

ID1 ID2 ID3 feat1 feat2
1 a x class1 class2
1 a y class1 class2
1 b x class2 class1
1 b y class2 class1
1 b z class2 class1
1 c x class1 class1
2 a x class1 class2
2 a y class1 class2
2 b x class2 class1
2 b y class2 class1
2 b z class2 class1
2 c x class1 class1

按 ID1、ID2 和 ID3 分组

我想在组级别之间(即在 a、b 和 c 之间)随机重新调整 feat1 和 feat2 值(class1 或 class2),而不进行替换。 因此,随机输出可能是:

ID1 ID2 ID3 feat1 feat2
1 a x class2 class1
1 a y class2 class1
1 b x class1 class1
1 b y class1 class1
1 b z class1 class1
1 c x class1 class2
2 a x class2 class1
2 a y class2 class1
2 b x class1 class1
2 b y class1 class1
2 b z class1 class1
2 c x class1 class2

在这种随机洗牌中,'a' 从 'b' 中获取特征值; 'b' 取自 'c' ;和'a'中的'c'

我的代码是

my_df_reshuffled = my_df %>%
  group_by(ID1, ID2, ID3) %>%
  slice(sample(1:n()))

但它不会在组之间打乱值,只是改变组级别的顺序,同时保持每个组的feat1和feat2值相等。

我错过了什么?

谢谢

【问题讨论】:

    标签: r dplyr tidyverse slice


    【解决方案1】:

    如果我理解正确,我想这可能会对你有所帮助

    数据

    df <- structure(list(ID1 = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
    2L, 2L), ID2 = c("a", "a", "b", "b", "b", "c", "a", "a", "b", 
    "b", "b", "c"), ID3 = c("x", "y", "x", "y", "z", "x", "x", "y", 
    "x", "y", "z", "x"), feat1 = c("class1", "class1", "class2", 
    "class2", "class2", "class1", "class1", "class1", "class2", "class2", 
    "class2", "class1"), feat2 = c("class2", "class2", "class1", 
    "class1", "class1", "class1", "class2", "class2", "class1", "class1", 
    "class1", "class1")), class = "data.frame", row.names = c(NA, 
    -12L))
    

    代码

    df %>% 
      group_by(ID1) %>% 
      mutate(across(.cols = starts_with("feat"),
                    .fns = function(x)sample(x,length(x))))
    

    输出

    # A tibble: 12 x 5
    # Groups:   ID1 [2]
         ID1 ID2   ID3   feat1  feat2 
       <int> <chr> <chr> <chr>  <chr> 
     1     1 a     x     class2 class1
     2     1 a     y     class2 class1
     3     1 b     x     class2 class2
     4     1 b     y     class1 class1
     5     1 b     z     class1 class1
     6     1 c     x     class1 class2
     7     2 a     x     class1 class1
     8     2 a     y     class1 class2
     9     2 b     x     class2 class1
    10     2 b     y     class1 class2
    11     2 b     z     class2 class1
    12     2 c     x     class2 class1
    

    【讨论】: