1

我正在尝试制作一个包含人口统计信息的样本数据框。我想确保生成的每一行数据都是合乎逻辑的。具体来说,没有一行表示 22 岁以下同时拥有博士学位的人。如何让数据框对此进行逻辑检查?下面是我目前正在使用的代码。变量“a”是要输出的行数,“b”是年龄中位数,“d”是 NA 的概率。

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

4

1 回答 1

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')))
}
于 2013-02-18T02:48:59.060 回答