我想我在这里错过了一些非常简单的东西,或者我完全咆哮了错误的树,但是我一直在试图解决这个问题,而且我的新手R技能还没能破解它
我正在寻找一种方法来引用R函数中的值数组。我正在创建一个模拟人口,我有个体年龄,性别和种族,我想模拟没有糖尿病的存在。我有年龄段,性别和种族的糖尿病患病率,我已将其纳入2(性别)x11(年龄段)x6(种族)阵列。我想要做的是引用数组中正确的单元格,并将其与runif用于每个人进行bernoulli试验。
下面的代码是当前版本,但我尝试了许多不同的方法,结果各不相同:
function(AB,sex,eth){
AB<-AB
sex<- sex
eth<-as.numeric(eth)
#make matrix reference
#make 'european' equal to 'other'
eth <- ifelse(eth==7,6,eth)
#change male from a 0 coding to a 2 for array lookup
sex <- ifelse(sex==1,1,2)
#remove seven from AB due to diab data starting at 30-34 age bracket
agebracket <- AB-7
#random number drawn
diabbase <- runif(census$Total.Sex[AB],0,1)
#census$total.sex gives the total number in each age bracket
#array assignment
arrayvalue <- Darray[agebracket,sex,eth]
diab <- ifelse((diabbase >= (Darray[agebracket,sex,eth])) ,1,0)
return(diab)
}
如果我从命令行调用函数返回“arrayvalue”而不是“diab”并提交单个值而不是变量(即diabtest&lt; - diabgen(10,1,1)),则返回正确的值数组,但如果我提交变量(即diabtest&lt; - diabgen(AB,sex,eth),它将返回一个空数组。
如果我能提供进一步的信息,可能会让我说的更清楚,请告诉我,我会非常乐意这样做,这似乎很容易,但它正在努力。我愿意接受任何建议在其他/更好的方式做同样的事情,任何提示赞赏。
答案 0 :(得分:0)
这可能无法解决您的问题(我会根据需要更新),但它是一个简单的模拟数据帧,适用于您的条件(2x11x6因子)
brackets <- round(seq(15, 85, length.out = 12))
brlabels <- character()
for (i in 1:11) {
brlabels[i] <- paste(brackets[i], "to", brackets[i + 1], sep = " ")
}
AB <- cut(round(runif(100, 18, 80)), breaks = brackets, labels = brlabels)
sex <- factor(sample(c(1,2), 100, replace = TRUE), levels = c(1,2), labels = c("Male", "Female"))
eth <- factor(sample(c(1:6), 100, replace = TRUE), levels = c(1:6), labels = c("French", "German", "Swedish", "Polish", "Greek", "Italian"))
somerandombusiness <- rnorm(100, 50, 4)
sim.df <- data.frame(somerandombusiness)
sim.df$AB <- AB
sim.df$sex <- sex
sim.df$eth <- eth
首先选择三者中的特定交集可能更麻烦,但处理因子变量的大多数工具都需要数据帧。
修改1
您可以执行以下操作:
runif(1,0) >= (sim.df[which(sim.df$AB=="34 to 40"&sim.df$sex=="Male"&sim.df$eth=="German"), 1])
但我仍然不确定你为什么要这样做。首先,使用我的方法无法确保枚举所有可能的组合。你可以毫不费力地将样本量增加到几千,但这只会使每个组合都存在真正的可能性。在这种情况下,我选择了一个确实存在的。
您可以更轻松地执行此操作,例如table(sim.df$eth, sim.df[, 1] > 60)
,这将提供所有somerandombusiness
值的交叉表&gt; 60和各种族。