我想在具有例如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
答案 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)