卡住了2个数据帧行副本

时间:2014-11-13 01:53:34

标签: r

我决定学习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个数据帧复制到空数据帧中,只需根据需要调整空数据帧的大小?

谢谢

2 个答案:

答案 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
...