2017-08-08 58 views
1

我有一个200个人的数据框,并使用dplyr我想随机选择其中一半,创建一个变量,称为'性',并将性别指定为100作为男性。对于剩余的100个人,我想将性别分配为女性。下面提供了一个可重复使用的数据集示例。随机抽样和使用dplyr分配变量

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语句的方式将剩余的女性分配为女性?

+0

你尝试基础R? – Wen

回答

2

如果你确实需要男性和女性之间的各占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 
+1

或者只是'df%>%mutate(sex = sample(rep(c(“male”,“female”),nrow(df)/ 2)))' – Nate

+0

或'df%>%slice(sample(n ))%>%mutate(sex = rep(c(“male”,“female”),length.out = n()))'假设随机重新排序是可以的。 – Frank