2013-02-18 37 views
1

我想用他们的人口统计信息制作一个人的样本数据框。我想确保生成的每一行数据都是逻辑的。具体来说,没有任何一行表明22岁以下的人也拥有博士学位。我如何使数据框对此进行逻辑检查?以下是我目前使用的代码。变量“a”是要输出的行数,“b”是中位年龄,“d”是NA的概率。随机人口统计数据框架理智检查R

AgeFn <- function(a,b){ 
    MedianYr <- b 
    Year <- 1900 + as.POSIXlt(Sys.Date())$year 
    RNormYr <- as.integer((rnorm(a)*10+MedianYr)) 
    Age1 <- Year - RNormYr 
} 

EducationFn <- function(a, d){ 
    EducationLs <- c("Some High School", "High School Grad", "Associates", "Bachelors",  
    "Masters", "Profession", "Doctorate", NA) 
    Education1 <- sample(EducationLs, a, replace=TRUE, prob=c(0.085, 0.25, 0.075, 0.176, 0.072, 
    0.019, 0.012, d)) 
    return(Education1) 
} 

UserGen <- function(a,b,d){ 
    ID <- c(1:a) 
    Age <- AgeFn(a,b,c) 
    Education <- EducationFn(a,d) 
    data.frame(ID, Age, Gender, Education) 
} 

系统:Mac OS 10.8.2,RStudio:v0.97.312

+0

嗨有。你能否澄清'Age < - AgeFn(a,b,c)'中的'c'。感谢并欢迎来到SO – 2013-02-18 02:24:08

+0

如果您将您的EducationFn概率扩展为年龄的函数会更好。 (在实际样本中是这样。)尽管不太可能,22岁以下的人有可能获得博士学位。 – N8TRO 2013-02-18 02:54:35

回答

2

如果你要检查你的data.frame不期望的组合,你可以使用命令,如:

subset(df, Age <= 22 & Education == 'Doctorate') 

df[df$Age <= 22 & df$Education == 'Doctorate',] 

这两者都将返回数据框中符合条件的任何行。

如果您的意图是从另一个既定变量的条件概率分布中抽样,那么您可以尝试ifelse。一个详细的例子:

EduByAge <- function (Age) { 
    ifelse(Age < 12 , sample(c('Elementary', 'Middle'), size=1), 
    ifelse(Age < 22, sample(c('Elementary', 'Middle', 'High', 'College'), size=1), 
      ifelse(Age < 35, sample(c('Elementary','Middle','High','College','Masters','Doctorate'),size=1), 'None'))) 
} 
+0

我不确定这个'ifelse'语句的字符串是否会按预期方式解析。具体来说,最后一个有'yes'参数,但没有'no'参数。 – 2013-02-18 03:12:37

+0

@RicardoSaporta好点,谢谢,我会抛出一个默认值。 – 2013-02-18 03:15:10

+0

我不认为它需要一个默认值。你最后一个'ifelse'就是前一个'ifelse'的_else_。 – 2013-02-18 03:16:04