2013-06-21 2 views
0

복잡한, 여러 부분으로 구성된 질문이 있습니다. 자신을 분명하게하지 않으면 사과드립니다. 나는 또한 초보자 인 R 사용자이기 때문에 용서해 준다. 고래 다이빙 데이터 및 먹이 분포 데이터에 대한 코 로케이션 인덱스를 계산하고 싶습니다. 이 수반 :큰 데이터 세트에 대한 코 로케이션 인덱스 계산 R

  1. 먹이 (물고기와 zoop) 데이터에서 깊이 쓰레기통에 DIVE BY 다이빙 데이터의 고래 깊이의 주파수 분포를 계산.
  2. 각 다이빙마다 무게 중심 (CG)과 관성 (I)을 계산하십시오.
  3. 각 다이빙에 대해 세계 치다 색인 (GIC) 대 각 먹이 유형을 계산하십시오.

나는 다이빙으로 데이터를 분리 할 필요가 없도록 함수 (또는 일련의 함수)를 작성하고 각 다이브의 함수를 수동으로 재실행 할 수 있기를 원합니다.

다이빙 횟수 (때때로 40+ 다이빙), 다이빙이 깊이와 같고 등급이 다이빙 유형과 관련이있는 숫자 인 경우의 고래 데이터. [IMG] http://i41.tinypic.com/33vc5rs.jpg[/IMG]

깊이 쓰레기통 먹이 정보가 포함 된 별도의 데이터 세트에서 온 :

enter image description here

을 나는 전체 다이빙 데이터를 작동하지만를 작성해야 다음과 같은 코드가 루프하거나 하나의 파일에 포함 된 각 다이빙의 데이터에 대해 실행할 수있는 적용 기능을 포함하십시오. 그래서 40 번의 다이빙을하는 고래에게는 40 개의 고래 수, 40 개의 고래 CG, 40 개의 고래 등이 필요합니다. 먹이 분포는 각 다이빙마다 동일합니다! 궁극적으로 델타 GIC 값의 목록이 포함 된 표를 원합니다.

#bin whale dive depths 
dive.cut=cut(whale,c(0 ,depths), right=FALSE) 
dive.freq=table(dive.cut) 

# compute CG 
fish.CG=sum(depths*fish)/sum(fish) 
whale.CG=sum(depths*whale.freq)/sum(whale.freq) 
zoop.CG=sum(depths*zoop)/sum(zoop) 

# compute Inertia 
fish.I=sum((depths-fish.CG)^2*fish)/sum(fish) 
whale.I=sum((depths-whale.CG)^2*whale.freq)/sum(whale.freq) 
zoop.I=sum((depths-zoop.CG)^2*zoop)/sum(zoop) 

#compute GIC as per 
# compute delta CG 
deltaCG.fish_whale=fish.CG-whale.CG 
GIC.fish_whale= 1-((deltaCG.fish_whale)^2/((deltaCG.fish_whale)^2+fish.I+whale.I)) 
deltaCG.zoop_whale=zoop.CG-whale.CG 
GIC.zoop_whale= 1-((deltaCG.zoop_whale)^2/((deltaCG.zoop_whale)^2+zoop.I+whale.I)) 

UPDATES 나는 먹이와 고래 다이빙 모두에 대해 예를 들어 데이터를 붙여왔다.

먹이 데이터

depths  fish  zoop 
1  5  0.00000 0.000000 
2  10  0.00000 0.000000 
3  15  0.00000 0.000000 
4  20 21.24194 0.000000 
5  25 149.51694 14.937945 
6  30 170.43214 0.000000 
7  35 296.93453 0.737109 
8  40 16.61643 4.295556 
9  45 92.68130 26.384844 
10 50 50.68548 55.902301 
11 55 37.47343 218.673781 
12 60 32.74443 204.452678 
13 65 20.62983 113.112452 
14 70 13.75121 83.014457 
15 75 16.15562 55.051358 
16 80 22.65562 96.746271 
17 85 42.99768 302.229135 
18 90 16315.65099 783.868978 
19 95 43006.20482 1713.133161 
20 100 23476.24740 3440.034642 
21 105 30513.66346 6667.914707 
22 110 17411.64500 9398.790964 
23 115 12127.70195 7580.233165 
24 120 4526.63393 7205.768739 
25 125 3328.89644 6567.175766 
26 130 1864.21486 4567.446886 
27 135 2202.07464 4295.772442 
28 140 2719.29417 4419.903403 
29 145 1710.75599 5102.689940 
30 150 2033.69552 4496.121974 
31 155 2796.81788 3269.193606 
32 160 967.09406 2310.203528 
33 165 437.30896 447.940140 
34 170 193.15526 63.731336 
35 175 143.88043 38.004799 
36 180 406.31373 22.565211 
37 185 786.30087 31.889927 
38 190 1643.52542 36.580063 
39 195 1665.69794 14.084152 
40 200 1281.15790 0.000000 
41 205 753.75309 35.343794 
42 210 252.48867 0.000000 

고래 데이터 :

Number Dive Class 
1  1 95.1  F 
2  1 95.9  F 
3  1 95.1  F 
4  1 95.9  F 
5  1 96.8  F 
6  1 97.2  F 
7  1 96.8  F 
8  2 95.5  N 
9  2 94.2  N 
10  3 94.7  F 
11  3 94.2  F 
12  3 94.2  F 
13  3 95.9  F 
14  3 95.9  F 
15  4 93.8  F 
16  4 97.7  F 
17  4 99.4  F 
18  4 94.7  F 
19  4 92.5  F 
20  4 98.1  F 
21  5 97.2  N 
22  5 98.5  N 
23  5 95.5  N 
24  5 97.2  N 
25  5 98.5  N 
26  5 96.4  N 
27  5 94.7  N 
28  5 95.5  N 
+0

내가 링크를 살펴했지만, whale' 코드에서를 의미한다 무엇을 '찾을 수 없습니다. [전체 (그러나 최소) 데이터 세트] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)를 더 줄 수 있습니까? 또한 링크보다는 질문에 넣어보십시오. – dardisco

+0

죄송합니다. 실수로 이전 버전의 코드를 붙여 넣었습니다. 다이빙 깊이 비닝 (binning)에서 "고래"는 "다이빙"과 같아야합니다. 지금 내 사무실 컴퓨터에 있지 않아서 내 데이터에 액세스 할 수 없습니다. 위의 설명이 도움이되지 않으면 약간의 데이터를 모의하고 재 게시합니다. 감사! – akbreezo

답변

1

이 코드를 사용 해보세요. 게시 한 데이터에 대해 테스트 해 보았습니다. 나는 먹이 데이터 프레임의 깊이를 사용했다. 그것이 당신이하고 싶은 일인지 확실하지 않습니다. 그리고 이번에는 다이빙에 고래 $ 다이브를 사용했다고 생각했습니다 .freq. 그렇지 않은 경우 변경해야합니다. (참고,이 질문은 교차 게시 역시 R-도움말 목록에 있었다.)

prey <- structure(list(depths = c(5L, 10L, 15L, 20L, 25L, 30L, 35L, 40L, 
    45L, 50L, 55L, 60L, 65L, 70L, 75L, 80L, 85L, 90L, 95L, 100L, 
    105L, 110L, 115L, 120L, 125L, 130L, 135L, 140L, 145L, 150L, 155L, 
    160L, 165L, 170L, 175L, 180L, 185L, 190L, 195L, 200L, 205L, 210L 
    ), fish = c(0, 0, 0, 21.24194, 149.51694, 170.43214, 296.93453, 
    16.61643, 92.6813, 50.68548, 37.47343, 32.74443, 20.62983, 13.75121, 
    16.15562, 22.65562, 42.99768, 16315.65099, 43006.20482, 23476.2474, 
    30513.66346, 17411.645, 12127.70195, 4526.63393, 3328.89644, 
    1864.21486, 2202.07464, 2719.29417, 1710.75599, 2033.69552, 2796.81788, 
    967.09406, 437.30896, 193.15526, 143.88043, 406.31373, 786.30087, 
    1643.52542, 1665.69794, 1281.1579, 753.75309, 252.48867), zoop = c(0, 
    0, 0, 0, 14.937945, 0, 0.737109, 4.295556, 26.384844, 55.902301, 
    218.673781, 204.452678, 113.112452, 83.014457, 55.051358, 96.746271, 
    302.229135, 783.868978, 1713.133161, 3440.034642, 6667.914707, 
    9398.790964, 7580.233165, 7205.768739, 6567.175766, 4567.446886, 
    4295.772442, 4419.903403, 5102.68994, 4496.121974, 3269.193606, 
    2310.203528, 447.94014, 63.731336, 38.004799, 22.565211, 31.889927, 
    36.580063, 14.084152, 0, 35.343794, 0)), .Names = c("depths", 
    "fish", "zoop"), class = "data.frame", row.names = c("1", "2", 
    "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", 
    "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", 
    "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", 
    "37", "38", "39", "40", "41", "42")) 

whale <- structure(list(Number = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
    3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 
    5L, 5L, 5L), Dive = c(95.1, 95.9, 95.1, 95.9, 96.8, 97.2, 96.8, 
    95.5, 94.2, 94.7, 94.2, 94.2, 95.9, 95.9, 93.8, 97.7, 99.4, 94.7, 
    92.5, 98.1, 97.2, 98.5, 95.5, 97.2, 98.5, 96.4, 94.7, 95.5), 
    Class = c("F", "F", "F", "F", "F", "F", "F", "N", "N", "F", 
    "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "N", "N", 
    "N", "N", "N", "N", "N", "N")), .Names = c("Number", "Dive", 
    "Class"), class = "data.frame", row.names = c("1", "2", "3", 
    "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", 
    "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", 
    "27", "28")) 

# split the data frame into a list with a different element for each dive 
dives <- split(whale, whale$Dive) 

# define a single function that does all of your computations 
compute <- function(whale, depths, fish, zoop) { 
    # you don't say what part of the whale data you are counting ... I'll assume it's the dive 
    dive.freq <- table(cut(whale$Dive, c(0, depths))) 
    #compute Center of Gravity 
    fish.CG <- sum(depths*fish)/sum(fish) #calculate CG for fish distribution ONCE for each whale 
    zoop.CG <- sum(depths*zoop)/sum(zoop) #calculate CG for zoop distribution ONCE for each whale 
    whale.CG <- sum(depths*dive.freq/sum(dive.freq)) #calculate for EACH dive 
    #compute Inertia 
    fish.I <- sum((depths-fish.CG)^2*fish)/sum(fish) 
    zoop.I <- sum((depths-zoop.CG)^2*zoop)/sum(zoop) 
    whale.I <- sum((depths-whale.CG)^2*dive.freq)/sum(dive.freq) #needs to be calculated for EACH dive 
    # compute delta CG 
    deltaCG.fish_whale <- fish.CG-whale.CG 
    GIC.fish_whale <- 1-((deltaCG.fish_whale)^2/((deltaCG.fish_whale)^2+fish.I+whale.I)) 
    deltaCG.zoop_whale <- zoop.CG-whale.CG 
    GIC.zoop_whale <- 1-((deltaCG.zoop_whale)^2/((deltaCG.zoop_whale)^2+zoop.I+whale.I)) 
    # then list off all the variables you want to keep as output from the function here 
    c(fish.CG=fish.CG, whale.CG=whale.CG, zoop.CG=zoop.CG, fish.I=fish.I, whale.I=whale.I, zoop.I=zoop.I, 
     GIC.fish_whale=GIC.fish_whale, GIC.zoop_whale=GIC.zoop_whale) 
    } 

# apply the compute function to each element of the dives list 
t(sapply(dives, function(dat) compute(whale=dat, depths=prey$depths, fish=prey$fish, zoop=prey$zoop))) 
+0

내 데이터에 맞게 몇 가지 수정을했는데 이것이 올바른 길에있는 것으로 보입니다. 기능 (dat)이란 무엇입니까?결과 코드를 실행할 때 "오류 : 계산 (dat, depths, fish, zoop)) : 비 기능을 적용하려고 시도합니다."라는 메시지가 나타납니다. – akbreezo

+0

데이터를 테스트 한 후 내 대답을 편집했습니다. 약간의 변경을가했습니다. 지금 일하고있는 것 같습니다. 'sapply()'함수에서'dat'은'dives'리스트의 각 엘리먼트에 부여한 닉네임입니다. 당신은'lapply()'와'sapply()'함수에 익숙해지고 싶을 것이다. –

+0

작업 중! 고맙습니다! – akbreezo