我决定学习R并且正在阅读R书中的科学编程简介(http://www.ms.unimelb.edu.au/spuRs/)
我目前陷入了本书第7章的问题3,问题是:
考虑以下非常简单的遗传模型。人口包括 同等数量的两性:男性和女性。在每一代男人和女人 女性随机配对,每对产生两个后代, 一男一女。我们对高度的分布感兴趣 从一代到下一代。假设两个孩子的身高 只是他们父母身高的平均值,将如何分配 几代人的身高变化?
将当前一代的高度表示为具有两个的数据帧 变量,m和f,适用于两性。命令rnorm(100,160,20) 将根据正态分布生成长度为100的向量 平均值为160,标准差为20(见第16.5.1节)。我们用它来 在第1代随机生成人口:
pop <- data.frame(m = rnorm(100, 160, 20), f = rnorm(100, 160, 20))
命令样本(x,size = length(x))将返回一个随机样本 尺寸大小取自矢量x(无替换)。 (它也会 如果可选参数replace设置为TRUE,则替换为sample。) 以下函数将弹出数据框并随机置换 订购的男人。然后男人和女人按行排列, 并且通过取平均值来计算下一代的高度 每一行。该函数返回一个具有相同结构的数据帧 下一代的高度。
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所示。您看到的现象称为回归 平均。
提示:使用变量height和generation构建一个数据框,其中 每行代表一个人。
我构建了一个空白数据框:
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个数据帧复制到空数据帧中,只需根据需要调整空数据帧的大小?
谢谢
答案 0 :(得分:0)
不确定您正在寻找的确切输出。这是一种应该足够简单的方法。 **注意:有很多可行的方法。
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
答案 1 :(得分:0)
尝试:
> 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
...