2013-02-18 48 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