我已经决定学习R,并且正在学习R书中的科学编程入门(http://www.ms.unimelb.edu.au/spuRs/)
我现在被困在这本书的第七章问题3上,问题是:
考虑下面这个非常简单的遗传模型。人口由数量相等的两种性别组成:男性和女性。在每一代,男人和女人随机配对,每一对正好产生两个后代,一男一女。我们对身高从一代到下一代的分布感兴趣。假设两个孩子的身高都是他们父母身高的平均值,那么身高的分布在几代人之间会发生什么变化呢?
将当前一代的高度表示为具有两个性别变量m和f的数据帧。命令rnorm(100,160,20)将根据均值为160,标准差为20的正态分布生成一个长度为100的向量(参见第16.5.1节)。我们使用它在第1代随机生成种群:
pop <- data.frame(m = rnorm(100, 160, 20), f = rnorm(100, 160, 20))sample(x,size = length(x))命令将返回从向量x中随机抽取的大小为x的样本(没有替换)。(如果可选参数replace设置为TRUE,它也将使用replace进行采样。)下面的函数获取数据帧pop,并随机排列男人的顺序。然后将男性和女性按行配对,并通过取每行的平均值来计算下一代的身高。该函数返回具有相同结构的数据帧,给出下一代的高度。
next.gen <- function(pop) {
pop$m <- sample(pop$m)
pop$m <- apply(pop, 1, mean)
pop$f <- pop$m
return(pop)
}使用函数next.gen生成九代,然后使用网格函数直方图绘制每一代中男性身高的分布,如图7.7所示。你所看到的现象叫做回归均值。
提示:使用高度和生成变量构建一个数据帧,其中每一行代表一个人。
我已经构建了一个空白数据框架:
generations <- data.frame(gen="", height="")现在,我尝试将第一代的身高信息放入其中,所以我运行:
next.gen(pop)
generations$height <- pop$m我得到了以下错误:
Error in `$<-.data.frame`(`*tmp*`, "height", value = c(165.208323681597, :
replacement has 100 rows, data has 1我知道我正试图将pop$m数据帧中的信息挤入单行生成的$height中,这是导致问题的原因,我不知道如何解决这个问题?我认为空白数据帧足够灵活,可以在从pop数据帧复制行时添加行。
然后我试着运行这段代码:
generations <- pop$m我得到了100个值,但这只是将我的几代数据帧转换为一个向量,我认为并运行
generations仅列出以向量形式复制的值。
我想我走错了第一步,我的数据帧定义是正确的吗?为什么我不能将行信息从1个数据帧复制到一个空的数据帧中,然后根据需要调整空数据帧的大小?
谢谢
发布于 2014-11-13 10:34:57
不确定您正在寻找的确切输出。这里有一种方法,它应该足够简单,可以遵循。**注意:有很多可行的方法。
pop <- data.frame(m = rnorm(100, 160, 20), f = rnorm(100, 160, 20))
next.gen <- function(pop) {
pop$m <- sample(pop$m)
pop$m <- apply(pop, 1, mean)
pop$f <- pop$m
return(pop)
}
# the code
test <- list()
for (i in 1:9) {
test[[i]] <- next.gen(pop)["m"]
test[[i]]$generation <- paste0("g", i)
}
library(data.table)
test2 <- rbindlist(test)
# result
m generation
1: 174.6558 g1
2: 143.2617 g1
3: 185.2829 g1
4: 168.9719 g1
5: 151.6948 g1
---
896: 159.6091 g9
897: 161.4546 g9
898: 171.8679 g9
899: 138.4982 g9
900: 152.7390 g9发布于 2014-11-13 11:53:38
尝试:
> generations <- data.frame(gen="", height="", stringsAsFactors=F)
> for(i in 1:length(pop$m)) generations[i,] = c("",pop$m[i])
> generations
gen height
1 136.70042632318
2 153.985392293761
3 122.077485676327
4 166.582538529591
5 170.751368839498
6 190.8894492681
...https://stackoverflow.com/questions/26900048
复制相似问题