Добавьте столбец к сгруппированным данным, который присваивает 1 отдельным лицам и случайным образом присваивает 1 или 0 парам - PullRequest
3 голосов
/ 27 мая 2020

У меня есть фрейм данных ...

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))
   )

Ответы [ 3 ]

2 голосов
/ 27 мая 2020

Вы можете выбрать длину последовательности семейной группы и взять ответ по модулю 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


1 голос
/ 27 мая 2020

Другой вариант

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
1 голос
/ 27 мая 2020

Мы можем использовать 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
...