【问题标题】:Randomly sampling and assigning a variable using dplyr使用 dplyr 随机采样和分配变量
【发布时间】:2017-08-08 17:30:16
【问题描述】:

我有一个包含 200 个人的数据框,我想使用 dplyr 随机选择其中的一半,创建一个名为“sex”的变量,并将性别分配为 100 为男性。对于剩下的 100 个人,我想将性别指定为女性。下面提供了一个可重现的数据集示例。

df <- dput(input)
structure(list(id = 1:200, age = c(6L, 4L, 4L, 6L, 1L, 5L, 3L, 
1L, 0L, 0L, 0L, 5L, 5L, 5L, 3L, 4L, 4L, 2L, 2L, 3L, 3L, 4L, 6L, 
4L, 4L, 0L, 4L, 6L, 1L, 5L, 2L, 6L, 2L, 2L, 0L, 3L, 1L, 6L, 0L, 
2L, 5L, 3L, 5L, 3L, 1L, 6L, 6L, 0L, 4L, 5L, 0L, 5L, 3L, 6L, 1L, 
2L, 1L, 1L, 4L, 2L, 1L, 2L, 0L, 4L, 3L, 3L, 6L, 2L, 1L, 2L, 5L, 
0L, 5L, 2L, 5L, 3L, 3L, 3L, 2L, 5L, 1L, 0L, 0L, 1L, 6L, 3L, 1L, 
5L, 6L, 4L, 4L, 4L, 0L, 6L, 6L, 3L, 4L, 6L, 5L, 2L, 5L, 6L, 2L, 
2L, 4L, 0L, 4L, 6L, 5L, 6L, 0L, 6L, 2L, 1L, 5L, 5L, 5L, 5L, 3L, 
1L, 6L, 3L, 1L, 1L, 3L, 4L, 2L, 4L, 2L, 0L, 5L, 0L, 3L, 1L, 1L, 
2L, 0L, 5L, 2L, 3L, 6L, 5L, 2L, 6L, 0L, 0L, 6L, 6L, 1L, 4L, 2L, 
0L, 4L, 1L, 3L, 6L, 3L, 4L, 3L, 0L, 1L, 6L, 6L, 5L, 4L, 1L, 1L, 
6L, 0L, 1L, 2L, 1L, 1L, 2L, 0L, 4L, 1L, 2L, 2L, 2L, 1L, 6L, 5L, 
3L, 2L, 3L, 5L, 2L, 3L, 4L, 5L, 0L, 6L, 5L, 1L, 4L, 5L, 3L, 5L, 
5L), x = c(21, 9, 31, 55, 5, 63, 63, 3, 13, 21, 53, 77, 5, 67, 
63, 31, 17, 5, 21, 45, 79, 3, 7, 43, 27, 1, 63, 11, 37, 33, 27, 
53, 71, 73, 97, 87, 77, 17, 85, 91, 49, 87, 89, 61, 65, 17, 71, 
33, 53, 85, 49, 41, 75, 85, 79, 75, 23, 63, 89, 31, 29, 47, 75, 
63, 65, 27, 27, 71, 89, 29, 25, 49, 91, 91, 39, 65, 45, 99, 53, 
21, 29, 81, 35, 7, 27, 81, 93, 41, 79, 83, 31, 51, 33, 75, 15, 
69, 7, 29, 7, 35, 87, 93, 57, 13, 91, 87, 95, 77, 7, 37, 81, 
99, 83, 69, 85, 5, 77, 69, 55, 7, 39, 5, 41, 1, 63, 25, 13, 39, 
97, 73, 25, 49, 35, 95, 59, 75, 23, 35, 67, 73, 91, 83, 79, 9, 
27, 89, 79, 53, 89, 69, 95, 57, 11, 45, 63, 5, 25, 61, 3, 89, 
1, 61, 85, 75, 67, 73, 63, 77, 43, 31, 69, 39, 47, 59, 75, 45, 
57, 73, 5, 85, 57, 13, 91, 69, 79, 89, 13, 33, 15, 23, 89, 85, 
39, 87, 7, 97, 57, 5, 61, 85), y = c(41, 57, 29, 59, 83, 77, 
35, 73, 99, 69, 85, 23, 85, 11, 63, 97, 73, 47, 57, 73, 77, 1, 
91, 17, 71, 57, 11, 3, 81, 31, 5, 41, 69, 93, 3, 11, 45, 97, 
81, 87, 43, 9, 53, 61, 11, 63, 59, 33, 49, 89, 87, 79, 47, 59, 
41, 25, 47, 13, 69, 11, 93, 83, 91, 85, 13, 95, 13, 37, 99, 35, 
11, 63, 19, 99, 71, 55, 5, 21, 43, 59, 49, 15, 99, 15, 75, 77, 
53, 51, 91, 45, 83, 21, 29, 35, 3, 27, 97, 95, 29, 53, 55, 41, 
45, 31, 75, 37, 15, 47, 3, 1, 99, 55, 81, 37, 1, 41, 51, 45, 
27, 83, 9, 69, 13, 81, 91, 55, 51, 31, 17, 97, 1, 47, 35, 7, 
53, 59, 5, 51, 7, 5, 93, 63, 95, 51, 33, 43, 75, 67, 59, 89, 
49, 83, 21, 49, 5, 5, 19, 45, 29, 41, 25, 3, 9, 1, 73, 53, 43, 
99, 69, 41, 21, 3, 3, 13, 39, 21, 55, 75, 91, 31, 79, 17, 43, 
91, 73, 11, 75, 15, 49, 77, 77, 23, 83, 47, 51, 53, 57, 99, 35, 
15)), row.names = c(NA, -200L), class = "data.frame", .Names = c("id", 
"age", "x", "y"))

我是使用 dplyr 的新手,所以我不确定如何执行此操作。我想它看起来像这样:

new_df <- df %>%
    sample_frac(0.5) %>% # use sample_frac or sample_n to select 100 individuals
    mutate(sex = "male")

但显然这只会产生一个新的数据框。有没有办法从原始数据框中选择 100 名男性,然后使用类似 ifelse 语句将其余的分配为女性?

【问题讨论】:

  • 你试过base R吗?

标签: r dplyr tidyverse


【解决方案1】:

如果您绝对需要男性和女性之间的 50/50 分布,您可以使用 dplyr 运行:

dfs <- sample_n(df, 100, replace = FALSE) %>%
  mutate(sex = "male") %>% 
  select(id, sex) %>% 
  right_join(df, by = "id") %>% 
  mutate(sex = if_else(is.na(sex), "female", "male"))

结果:

table(dfs$sex)

female   male 
   100    100 

【讨论】:

  • 或只是df %&gt;% mutate(sex = sample(rep(c("male", "female"), nrow(df)/2)))
  • df %&gt;% slice(sample(n())) %&gt;% mutate(sex = rep(c("male", "female"), length.out=n())) 假设随机重新排序是可以的。
猜你喜欢
  • 2016-05-10
  • 2014-02-01
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 2014-06-06
  • 2019-11-19
  • 1970-01-01
  • 2014-06-01
相关资源
最近更新 更多