首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >固定使用2个数据帧行拷贝

固定使用2个数据帧行拷贝
EN

Stack Overflow用户
提问于 2014-11-13 09:53:34
回答 2查看 222关注 0票数 0

我已经决定学习R,并且正在学习R书中的科学编程入门(http://www.ms.unimelb.edu.au/spuRs/)

我现在被困在这本书的第七章问题3上,问题是:

考虑下面这个非常简单的遗传模型。人口由数量相等的两种性别组成:男性和女性。在每一代,男人和女人随机配对,每一对正好产生两个后代,一男一女。我们对身高从一代到下一代的分布感兴趣。假设两个孩子的身高都是他们父母身高的平均值,那么身高的分布在几代人之间会发生什么变化呢?

将当前一代的高度表示为具有两个性别变量m和f的数据帧。命令rnorm(100,160,20)将根据均值为160,标准差为20的正态分布生成一个长度为100的向量(参见第16.5.1节)。我们使用它在第1代随机生成种群:

代码语言:javascript
复制
pop <- data.frame(m = rnorm(100, 160, 20), f = rnorm(100, 160, 20))

sample(x,size = length(x))命令将返回从向量x中随机抽取的大小为x的样本(没有替换)。(如果可选参数replace设置为TRUE,它也将使用replace进行采样。)下面的函数获取数据帧pop,并随机排列男人的顺序。然后将男性和女性按行配对,并通过取每行的平均值来计算下一代的身高。该函数返回具有相同结构的数据帧,给出下一代的高度。

代码语言:javascript
复制
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所示。你所看到的现象叫做回归均值。

提示:使用高度和生成变量构建一个数据帧,其中每一行代表一个人。

我已经构建了一个空白数据框架:

代码语言:javascript
复制
generations <- data.frame(gen="", height="")

现在,我尝试将第一代的身高信息放入其中,所以我运行:

代码语言:javascript
复制
next.gen(pop)

generations$height <- pop$m

我得到了以下错误:

代码语言:javascript
复制
Error in `$<-.data.frame`(`*tmp*`, "height", value = c(165.208323681597,  : 
replacement has 100 rows, data has 1

我知道我正试图将pop$m数据帧中的信息挤入单行生成的$height中,这是导致问题的原因,我不知道如何解决这个问题?我认为空白数据帧足够灵活,可以在从pop数据帧复制行时添加行。

然后我试着运行这段代码:

代码语言:javascript
复制
generations <- pop$m

我得到了100个值,但这只是将我的几代数据帧转换为一个向量,我认为并运行

代码语言:javascript
复制
generations

仅列出以向量形式复制的值。

我想我走错了第一步,我的数据帧定义是正确的吗?为什么我不能将行信息从1个数据帧复制到一个空的数据帧中,然后根据需要调整空数据帧的大小?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-11-13 10:34:57

不确定您正在寻找的确切输出。这里有一种方法,它应该足够简单,可以遵循。**注意:有很多可行的方法。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2014-11-13 11:53:38

尝试:

代码语言:javascript
复制
> 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
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26900048

复制
相关文章

相似问题

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