在组级别之间排列列值
Permutate column values between group levels
我有一个数据框
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' 中获取; 'c' 来自 'a'
我的密码是
my_df_reshuffled = my_df %>%
group_by(ID1, ID2, ID3) %>%
slice(sample(1:n()))
但它不会在组之间打乱值,只是改变组级别的顺序,同时保持每个组的 feat1 和 feat2 值相等。
我错过了什么?
谢谢
如果我理解正确的话,我想这可能对你有所帮助
数据
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
我有一个数据框
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' 中获取; 'c' 来自 'a'
我的密码是
my_df_reshuffled = my_df %>%
group_by(ID1, ID2, ID3) %>%
slice(sample(1:n()))
但它不会在组之间打乱值,只是改变组级别的顺序,同时保持每个组的 feat1 和 feat2 值相等。
我错过了什么?
谢谢
如果我理解正确的话,我想这可能对你有所帮助
数据
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