在R中随机抽样一定百分比的行而不重复

时间:2015-10-26 15:23:34

标签: r sample

我有年龄和性别特征的人口数据,我试图根据其他数据填充另一个具有就业类型的列。我使用了&#39; sample&#39;选择一份兼职工作人口的样本,然后我会将这些数据作为一个新专栏添加,但我还没有弄清楚如何确保在下一个样本中不重新选择那些被选中的不同就业类型。< / p>

目前,我有以下情况,其中23%是某一年龄段的男性:

PT=my.df[sample(which(my.df$Age=="15" & my.df$Gender=="Male"), round(0.23*length (which(my.df$Age=="15" & my.df$Gender=="Male")))),]

我的输出示例如下:

         Edinburgh.ID    Age    Gender
2445         2445        15      Male
2477         2477        15      Male
2469         2469        15      Male
2485         2485        15      Male
2487         2487        15      Male
2483         2483        15      Male

我现在想要从具有不同就业类型的同一年龄和性别组中选择下一个x%。如果我只是将0.23更改为另一个百分比,在某些情况下会出现相同的ID,但我希望每个样本中都有单独的ID。

2 个答案:

答案 0 :(得分:2)

dplyr包提供了随机取样(out)替换随机抽样的可能性。

library('dplyr')
sample_frac(df, size = percentage, replace = FALSE)

然后您可以相应地调整您对年龄和性别的限制。

答案 1 :(得分:0)

您可以定义一个data.frame,描述给定组的就业统计数据和样本。这是基础R中的一种方法。

# Generate some data
N = 1000
my.df <- data.frame(Age = rep("15", N),
                    Gender = sample(c("Male", "Female"), N, TRUE),
                    Activity = rep("", N),
                    stringsAsFactors = FALSE)
head(my.df)
# Age Gender Activity
# 1  15 Female         
# 2  15   Male         
# 3  15   Male         
# 4  15 Female         
# 5  15   Male         
# 6  15 Female        

# employment statistics for the group age = "15" and gender = "Male"
employment <- data.frame(activity = letters[1:5],
                         prob = c(0.1, 0.1, 0.2, 0.5, 0.1),
                         stringsAsFactors = FALSE)
employment
# activity prob
# 1        a  0.1
# 2        b  0.1
# 3        c  0.2
# 4        d  0.5
# 5        e  0.1

# Assign activities
set.seed(35)
id   <- which(my.df$Age == "15" & my.df$Gender == "Male")
my.df[id, "Activity"] <- sample(employment$activity, length(id),
                      replace = TRUE, prob =  employment$prob)

table(my.df[my.df$Gender=="Male", "Activity"])/length(id)
# a         b         c         d         e 
# 0.1135903 0.1054767 0.1805274 0.4665314 0.1338742