0

我有一个数据框...

df <- tibble(
  id = 1:10, 
  family = c("a","a","b","b","c", "d", "e", "f", "g", "h")
  )

家庭最多只能包含 2 个成员(因此他们是个人或成对的)。

对于个人(只有一行的家庭,即 id = 5:10),我想创建一个名为“随机”的列,将 50% 的条目随机分配为 1,其余为 0。所有其他行(属于有 2 个成员的家庭)也应该等于 0。

到最后,数据应如下所示(取决于 50% 的行分配了 1)...

df <- tibble(
  id = 1:10, 
  family = c("a","a","b","b","c", "d", "e", "f", "g", "h"),
  random = c(0, 0, 0, 0, 1, 0, 1, 1, 0, 0)
  )

我主要使用 Tidyverse,并希望将其包含在管道中。

我目前正在尝试类似...

df %>%
   group_by(family) %>% 
   mutate(random = if(n() == 1) *not sure what goes here* else 0)
4

2 回答 2

1

如果 a 中的行数family大于 1,我们可以分配 0,否则选择 0 和 1 之间的随机值。

library(dplyr)

df %>%
  group_by(family) %>%
  mutate(random = if(n() > 1) 0 else sample(0:1, 1))

#      id family random
#   <int> <chr>   <dbl>
# 1     1 a           0
# 2     2 a           0
# 3     3 b           0
# 4     4 b           0
# 5     5 c           1
# 6     6 d           1
# 7     7 e           0
# 8     8 f           0
# 9     9 g           0
#10    10 h           0

如果我们想要为具有 1 值的组提供固定数量的 1 和 0,我们可以使用

df %>%
  add_count(family) %>%
   mutate(n = replace(n, n > 1, 0),
          n = replace(n, {inds = which(n == 1);sample(inds, length(inds)/2)}, 0))


# A tibble: 10 x 3
#      id family     n
#   <int> <chr>  <dbl>
# 1     1 a          0
# 2     2 a          0
# 3     3 b          0
# 4     4 b          0
# 5     5 c          1
# 6     6 d          0
# 7     7 e          0
# 8     8 f          1
# 9     9 g          1
#10    10 h          0
于 2020-06-01T11:37:21.313 回答
0

使用data.table

library(data.table)
setDT(df)[, if(.N > 1) 0 else sample(0:1, 1), family]
于 2020-06-01T19:17:39.897 回答