首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中的函数中引用数组值

在R中的函数中引用数组值
EN

Stack Overflow用户
提问于 2012-03-11 18:54:16
回答 1查看 262关注 0票数 0

我想我在这里遗漏了一些非常简单的东西,或者我完全弄错了树,然而我已经尝试了几天来解决这个问题,我的新手R技能一直无法破解它。

我正在寻找一种方法来引用R函数中的值数组。我正在创建一个模拟的人群,我有个人的年龄,性别和种族,我想模拟没有糖尿病的存在。我有一个2(性别)x11(年龄段)x6(种族)数组,我有按年龄段,性别和种族划分的糖尿病流行率。我想要做的是引用数组中正确的单元格,并将其与调用的runif一起使用,以针对每个人运行一次bernoulli试验。

下面的代码是当前版本,但是我尝试了许多不同的方法,结果各不相同:

代码语言:javascript
复制
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 <- diabgen(10,1,1) ),它会从数组中返回正确的值,但如果我提交变量(即diabtest <- diabgen(AB,sex,eth) ),它会返回一个空数组。

如果我能给出更多的信息,让我说的更清楚,请让我知道我会非常乐意这样做,这看起来很容易,但它让我头昏脑胀。我对任何其他/更好的方法做同样的事情的建议持开放态度,任何提示都很感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-11 20:08:14

这可能不能解决您的问题(我会根据需要进行更新),但它是针对您的条件(2x11x6因子)的简单模拟数据帧

代码语言:javascript
复制
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个

你可以这样做:

代码语言:javascript
复制
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值> 60和不同种族的交叉表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9654327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档