2017-09-13 63 views
0

我想在具有例如nrow = 11451個元素的數據幀上使用rnorm函數。我不知道如何編寫代碼來爲每行導致使用nsim列和nrow行的sim-dataframe應用rnorm。使用rorm作爲數據幀

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 

我預期的結果是讓每一行包括模擬值十個多列。

我用下面的代碼,但得到了「無效參數錯誤」

> dfnorm <- apply([email protected], 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

其實每個行DF我有平均值和sd,我想在rnorm函數中調用它們。 – Mohammad

+0

使用dput(head(df))而不是head(df),所以我們有一個可重複的數據集 – DataTx

+0

我添加了一個指向.rdata文件的鏈接。謝謝。 – Mohammad

回答

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 

然後使用適用於每一行去了。第二個參數可以是1或2,具體取決於是否應用於行或列。

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

這爲我工作在我的機器上

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

謝謝你的回答。正如我所說我有每一行的意思和SD,我不需要計算它們。所以我該怎麼做? – Mohammad

+1

@Mohammad在第一行的示例數據框中,它指定您希望樣本大小爲100.該組的平均值爲1,sd爲1.這些是實際值,不是計算值。 – DataTx

+0

謝謝!我可以更進一步。添加樣本大小的列是否很重要?我的意思是我們只能使用恆定的nsim? – Mohammad

1

可以做pmappurrr包裝和打造rnorms到您的權利數據幀:

library(tidyverse) 
[email protected] <- [email protected] %>% 
    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) 
+0

謝謝!有效!但它將spatialLinesDataFrame更改爲data.frame。有沒有辦法將模擬值作爲新列添加到dataFrameApply中? – Mohammad

+0

是的,但你會有不同的'Nsim'值? – Tunn

+0

其實沒有。Nsim對於所有行都是一樣的。 – Mohammad