2017-12-06 3 views
0

데이터 프레임에서 1 ~ 10 행의 무작위 샘플을 취하여 그 무작위 샘플링을 5 번 복제하고 각각의 무작위 샘플에 대한 네트워크 메트릭 (연결)을 계산하는 코드가 있습니다. 그러나이 코드는 데이터 프레임의 "사이트"및 "방법"의 각 수준에서 별도로 실행하고 싶습니다.데이터 프레임의 다른 요인 레벨을 반복

사이트 및 방법별로 데이터 프레임 (df)을 분할하고 각 하위 집합에서 아래 코드를 실행 한 다음 모든 출력을 "site", "method", "size"열이있는 단일 파일로 반환합니다. (샘플링 된 행 수) 및 "연결"?

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 

답변

0

다음과 같은 명령을 사용하여 사이트와 방법으로 데이터 집합을 분할 할 수 있습니다 : 여기

는 내가 지금까지 가지고있는 것입니다.

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

는 그 후 당신은 lapply 각 부분 집합에 함수를 적용 할 수 있습니다 예 :

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 

하면 작업을 수행해야합니다 :

lapply(df_split, FUN = nrow) 

즉, 당신이 할 수있는 출력을 얻으려면 주문 명령 !! 분할은 자동으로 하위 집합을 알파벳순으로 정렬하는 것 같습니다.

변수를 생성하려면 위에 표시된 코드를 모두 함수에 넣고 위의 nrow 함수와 동일한 방식으로 각 하위 집합에서 실행하면됩니다.

관련 문제