使用rnorm作为数据帧

时间:2017-09-13 21:57:26

标签: r random montecarlo

我想在具有例如nrow = 11451个元素的数据帧上使用rnorm函数。我不知道如何编写代码来为每一行应用rnorm,从而导致带有nsim列和nrow行的sim-dataframe。

dfsim <- rnorm (n=nsim, mean=df[[?]], sd=df[[?]])

举个例子:

> head(df)
An object of class "SpatialLinesDataFrame"
Slot "data":
           LINEARID            FULLNAME RTTYP MTFCC          M01         SD01 Nsim
10969 1104486135650       US Hwy 90 Alt     U S1200 0.0009886878 0.0001253361   10
10970 1104486135651       US Hwy 90 Alt     U S1200 0.0009831224 0.0001442643   10
10416 1102965182224 Southwest Fwy E Acc     M S1640 0.0010000000 0.0000000000   10
10494 1103342335512   Robin Hood Ct Pvt     M S1780 0.0010000000 0.0000000000   10
10493 1103342334514 Little John Way Pvt     M S1750 0.0010000000 0.0000000000   10
1847  1101842210421      Arrowood Cir N     M S1400 0.0010000000 0.0000000000   10

我的预期结果是每行包含10个列,包括模拟值。

我使用了以下代码但得到了“无效参数错误”

> dfnorm <- apply(df@data, 1, function(x) rnorm(x["Nsim"], mean=x["M01"], sd=x["SD01"]))
 Error in rnorm(x["Nsim"], mean = x["M01"], sd = x["SD01"]) : 
  invalid arguments 

由于数据帧太大,我使用子集函数只保留三行并将其保存到.rdata文件中。链接在这里: df.rdata

2 个答案:

答案 0 :(得分:2)

在您的数据框中,您需要添加一个样本大小的列,如:

 dataFrameApply <- data.frame(sampleSize = c(100,100,100),               
                            meanNum = c(1,2,3), sdNum = c(1,2,3))
      sampleSize meanNum sdNum
1        100       1     1
2        100       2     2
3        100       3     3

然后使用apply来遍历每一行。第二个参数可以是1或2,具体取决于是应用于行还是列。

normalize <- apply(dataFrameApply, 1, function(x) rnorm(x[1], mean=x[2], sd=x[3]))

这在我的机器上对我有用

dfDataFrame  <- as.data.frame(df@data)
dataFrameSub <- dfDataFrame[,c(7,5,6)]
normalize    <- apply(dataFrameSub,    1, function(x) rnorm(x[1], mean=x[2], 
                sd=x[3]))

答案 1 :(得分:1)

可以从pmap包中执行purrr并将rnorms构建到您的数据框中:

library(tidyverse)
df@data <- df@data %>% 
  mutate(rnorms = pmap(list(Nsim, M01, SD01), function(n, mu, sd) rnorm(n, mu, sd)),
         rnorms = map_chr(rnorms, ~ paste(., collapse = " "))) %>% 
  bind_cols(., read.table(text = .$rnorms, sep = " ")) %>%
  select(-rnorms)