2017-07-19 1 views
0

Ich möchte mehrere Zufallszahlen, die aus der Normalverteilung, für mehrere Paare von Mittelwert und Standardabweichung gesammelt werden. Diese Paare in einem data frame gespeichert sind, mit drei Spalten die identifiant des Paares, Wert der Mittelwert und die Standardabweichung, wie in dem folgenden Beispiel enthalten:R, Erstellen von mehreren Zufallszahlen aus jeder Zeile Datenreihe

ex <- data.frame("id" = c("id_1_0.1", "id_2_0.5"), "mean" = c(1, 2), "sd" = c(0.1, 0.5)) 

um für jedes Paar 10 Zufallszahlen zu erzeugen, verwendete ich diese zwei Linien:

tmp <- by(cbind(ex$mean, ex$sd), ex$id, function(x) rnorm(10, mean = x[, 1], sd = x[, 2])) 
tmp <- do.call(rbind, lapply(tmp, data.frame, stringsAsFactors = FALSE)) 

Was würde ich tun möchte, ist, dann beide Daten zusammenführen Rahmen ex und tmp alle Daten in einem Datenrahmen zu haben. Mit dieser Methode habe ich ein Problem der Namensgebung aufgrund der Inkrementierung, so dass ich keine einfache Zusammenführung machen kann.

Sollte ich versuchen, dies mit einer regex Formel zu lösen oder gibt es eine einfachere Lösung?

+0

Sorry für die falsche variable Referenz in meiner Antwort, hatte die temporäre Variable 'a' noch in meiner globalen Umgebung. – Florian

Antwort

0

Dieser Code scheint für Sie zu arbeiten:

library(dplyr) 
ex <- data.frame("id" = c("id_1_0.1", "id_2_0.5"), mean = c(1, 2), sd = c(0.1, 0.5)) 

random_list = apply(ex[,c("id","mean","sd")],1,function(x) { 
    data.frame(id=rep(x[1],10), 
      random= rnorm(10, mean = as.numeric(x[2]), sd = as.numeric(x[3])))}) 

ex = do.call(rbind,random_list) %>% left_join(ex) 

hoffe, das hilft!

+0

Es funktioniert perfekt, der Trick bestand darin, das Identifikator in der Anwendungsfunktion zu replizieren. Vielen Dank. –

0

Ich konnte einige Regex verwenden, um die Inkrementierungszähler Ihrer IDs zu löschen, damit sie mit Ihren ursprünglichen IDs zusammengeführt werden können. Es mag einen schöneren Weg geben, dies zu tun, aber das scheint zu funktionieren.

# Pull rownames in and delete counter 
tmp$id <- gsub("(.[^.]*$)", "", rownames(tmp)) 

# Merge with original data 
new <- merge(ex, tmp, by = "id") 
head(new) 
#   id mean sd X..i.. 
# 1 id_1_0.1 1 0.1 1.1226943 
# 2 id_1_0.1 1 0.1 1.0666694 
# 3 id_1_0.1 1 0.1 0.8848397 
# 4 id_1_0.1 1 0.1 0.9839212 
# 5 id_1_0.1 1 0.1 0.9027086 
# 6 id_1_0.1 1 0.1 0.9389538 

Regex: Wählen Sie ein . durch eine beliebige Zahl, gefolgt von nicht . Zeichen [^.]*, am Ende beginnen ($)

+0

Es funktioniert, danke für den 'regex' Code. Ich bestätige die andere Antwort, weil es mehr integriert ist, aber vielen Dank. –

Verwandte Themen