3

私はデータフレームを持っています...

df <- tibble(
  id = 1:7, 
  family = c("a","a","b","b","c", "d", "e")
  )

ファミリには、最大で 2 つのメンバーしか含まれません (つまり、個人またはペアのいずれかです)。

メンバーが 1 つしかないファミリー (例: c、d、e) に番号 1 を割り当て、2 つのメンバー (例では a と b) を含むファミリーに 0 または 1 をランダムに割り当てる新しい列「random」が必要です。

最終的に、データは次のようになります (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)
  )

私は主に Tidyverse を使用しているので、group_by と mutate の組み合わせでこれを実行できるようにしたいと考えています。

私は次のことを試しました(ただし、これは家族内でランダムに0/1を割り当てませんでした)...

df %>%
group_by(family) %>%
  mutate(
   random = if_else(
     condition = n() == 1,
     true = 1,
     false = as.double(sample(0:1,1,replace = T))
   )
4

3 に答える 3

2

家族グループのシーケンスの長さに沿ってサンプリングし、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


于 2020-05-27T17:42:36.647 に答える