将列添加到分组数据,将 1 分配给个人并随机分配 1 或 0 给对
Add column to grouped data that assigns 1 to individuals and randomly assigns 1 or 0 to pairs
我有一个数据框...
df <- tibble(
id = 1:7,
family = c("a","a","b","b","c", "d", "e")
)
家庭最多只包含 2 名成员(因此他们要么是个人,要么是成对)。
我需要一个新列 'random',它将数字 1 分配给只有一个成员的家庭(例如 c、d 和 e),并随机分配 0 或 1 给包含 2 个成员的家庭(a 和b 在例子中)。
到最后,数据应该如下所示(取决于 0/1 的随机分配)...
df <- tibble(
id = 1:7,
family = c("a","a","b","b","c", "d", "e"),
random = c(1, 0, 0, 1, 1, 1, 1)
)
我希望能够结合使用 group_by 和 mutate 来做到这一点,因为我主要使用 Tidyverse。
我尝试了以下方法(但这并没有在家庭中随机分配 0/1)...
df %>%
group_by(family) %>%
mutate(
random = if_else(
condition = n() == 1,
true = 1,
false = as.double(sample(0:1,1,replace = T))
)
您可以沿着家庭组的序列长度进行采样,然后取模 2 的答案:
df %>%
group_by(family) %>%
mutate(random = sample(seq(n())) %% 2)
#> # A tibble: 7 x 3
#> # Groups: family [5]
#> id family random
#> <int> <chr> <dbl>
#> 1 1 a 0
#> 2 2 a 1
#> 3 3 b 0
#> 4 4 b 1
#> 5 5 c 1
#> 6 6 d 1
#> 7 7 e 1
我们可以使用if/else
library(dplyr)
df %>%
group_by(family) %>%
mutate(random = if(n() == 1) 1 else sample(rep(0:1, length.out = n())))
# A tibble: 7 x 3
# Groups: family [5]
# id family random
# <int> <chr> <dbl>
#1 1 a 0
#2 2 a 1
#3 3 b 1
#4 4 b 0
#5 5 c 1
#6 6 d 1
#7 7 e 1
另一种选择
df %>%
group_by(family) %>%
mutate(random = 2 - sample(1:n()))
# A tibble: 7 x 3
# Groups: family [5]
id family random
# <int> <chr> <dbl>
# 1 1 a 1
# 2 2 a 0
# 3 3 b 1
# 4 4 b 0
# 5 5 c 1
# 6 6 d 1
# 7 7 e 1
我有一个数据框...
df <- tibble(
id = 1:7,
family = c("a","a","b","b","c", "d", "e")
)
家庭最多只包含 2 名成员(因此他们要么是个人,要么是成对)。
我需要一个新列 'random',它将数字 1 分配给只有一个成员的家庭(例如 c、d 和 e),并随机分配 0 或 1 给包含 2 个成员的家庭(a 和b 在例子中)。
到最后,数据应该如下所示(取决于 0/1 的随机分配)...
df <- tibble(
id = 1:7,
family = c("a","a","b","b","c", "d", "e"),
random = c(1, 0, 0, 1, 1, 1, 1)
)
我希望能够结合使用 group_by 和 mutate 来做到这一点,因为我主要使用 Tidyverse。
我尝试了以下方法(但这并没有在家庭中随机分配 0/1)...
df %>%
group_by(family) %>%
mutate(
random = if_else(
condition = n() == 1,
true = 1,
false = as.double(sample(0:1,1,replace = T))
)
您可以沿着家庭组的序列长度进行采样,然后取模 2 的答案:
df %>%
group_by(family) %>%
mutate(random = sample(seq(n())) %% 2)
#> # A tibble: 7 x 3
#> # Groups: family [5]
#> id family random
#> <int> <chr> <dbl>
#> 1 1 a 0
#> 2 2 a 1
#> 3 3 b 0
#> 4 4 b 1
#> 5 5 c 1
#> 6 6 d 1
#> 7 7 e 1
我们可以使用if/else
library(dplyr)
df %>%
group_by(family) %>%
mutate(random = if(n() == 1) 1 else sample(rep(0:1, length.out = n())))
# A tibble: 7 x 3
# Groups: family [5]
# id family random
# <int> <chr> <dbl>
#1 1 a 0
#2 2 a 1
#3 3 b 1
#4 4 b 0
#5 5 c 1
#6 6 d 1
#7 7 e 1
另一种选择
df %>%
group_by(family) %>%
mutate(random = 2 - sample(1:n()))
# A tibble: 7 x 3
# Groups: family [5]
id family random
# <int> <chr> <dbl>
# 1 1 a 1
# 2 2 a 0
# 3 3 b 1
# 4 4 b 0
# 5 5 c 1
# 6 6 d 1
# 7 7 e 1