2017-12-06 5 views
0

Ich habe einige Code, um Stichproben von 1 bis 10 Zeilen aus einem Datenrahmen zu nehmen, replizieren diese Stichproben 5 mal und berechnen eine Netzwerkmetrik (Verbindung) auf jeder der Stichproben. Allerdings möchte ich diesen Code getrennt über jede Ebene von "Site" und "Methode" in meinem Datenrahmen ausführen.Schleife über verschiedene Faktorstufen in einem Datenrahmen

Wie teile ich den Datenrahmen (df) nach Standort und Methode auf, führe den folgenden Code für jede Teilmenge aus und gebe dann alle Ausgaben in eine einzige Datei mit den Spalten "site", "method", "size" zurück (Anzahl der abgetasteten Zeilen) und "Verbindung"?

Hier ist, was ich bisher:

df <- read.table(text = "bird_sp plant_sp value site method 
        1 species_a plant_a  1 a  m 
        2 species_a plant_a  1 a  m 
        3 species_b plant_b  1 a  m 
        4 species_b plant_b  1 a  m 
        5 species_c plant_c  1 a  m 
        6 species_a plant_a  1 b  m 
        7 species_a plant_a  1 b  m 
        8 species_b plant_b  1 b  m 
        9 species_b plant_b  1 b  m 
        10 species_c plant_c  1 b  m 
        11 species_a plant_a  1 a  f 
        12 species_a plant_a  1 a  f 
        13 species_b plant_b  1 a  f 
        14 species_b plant_b  1 a  f 
        15 species_c plant_c  1 a  f 
        16 species_a plant_a  1 b  f 
        17 species_a plant_a  1 b  f 
        18 species_b plant_b  1 b  f 
        19 species_b plant_b  1 b  f 
        20 species_c plant_c  1 b  f", header = TRUE) 

#make sample function 
sample_fun <- function(x,size){ 
rows <- sample(1:nrow(x),size,replace=FALSE) 
intlist <- x[rows,] 
return(intlist) 
} 

#convert list to interaction matrix 
make_mat <- function(x){ 
mat <- with(x,tapply(value, list(plant_sp, bird_sp), sum)) 
mat[is.na(mat)] <- 0 
return(mat) 
} 

#create vector with required sample size and replication 
size_vector <- rep(1:10,5) 

#use vector to generate list of interactions 
samples_Data <- lapply(size_vector, function(x) sample_fun(df,x)) 

output <- lapply(samples_Data, function(x) 
make_mat(x)) 

library(bipartite) 

#calculate connectance on each element (matrix) in output list 
#ignore warnings 
metrics <- lapply(output, networklevel, index=c("connectance")) 
met <- data.frame(unlist(metrics)) 
names(met) <- names(metrics[[1]]) 

#Add number of interactions sampled 
met$size <- size_vector 

Antwort

0

Sie können den Datensatz nach Standort und Verfahren mit dem folgenden Befehl aufgeteilt.

df_split <- split(df, paste0(df$site, df$method)) 

Danach können Sie eine Funktion zu jeder Teilmenge mit lapply, also gelten:

lapply(df_split, FUN = nrow) 

Um Ihre Ausgabe erhalten Sie tun können, das heißt:

result <- unique(df[, c("site", "method")]) 
result <- result[order(result$site, result$method),] # !! SEE BELOW 
result$rows <- lapply(df_split, FUN = nrow) 
result 
    site method rows 
11 a  f 5 
1  a  m 5 
16 b  f 5 
6  b  m 5 

Seien Sie sicher, dass das tun Befehl bestellen !! Split scheint die Teilmengen automatisch alphabetisch zu ordnen.

Um Ihre Variable zu generieren, geben Sie einfach Ihren gesamten Code von oben in eine Funktion ein und führen Sie sie auf jeder Teilmenge auf dieselbe Weise wie die oben gezeigte nrow Funktion aus.

Verwandte Themen