2013-06-21 3 views
0

У меня сложный, многочастный вопрос. Приношу свои извинения, если я не понимаю. Я тоже довольно послушный пользователь R, так что простите меня, если это кажется рудиментарным. Я хочу рассчитать индекс colocation для данных погружения китов и данных распределения добычи. Это влечет за собой:Вычисление индекса colocation для большого набора данных R

  1. Расчет частотного распределения китов глубины погружения данных BY Погружения в глубинах бункеров от добычи (рыб и Zoop) данных.
  2. Для каждого погружения вычислите центр тяжести (CG) и инерцию (I).
  3. Для каждого погружения вычислите глобальный индекс colocation (GIC) по сравнению с каждой добычей .

Я хочу, чтобы иметь возможность написать функцию (или ряд функций), так что мне не нужно отделять данные от погружения и повторно запускать функции для каждого погружения вручную.

Пример данных кита, где число, если число погружений (иногда 40+ погружений), погружение равно глубине, а классификация связана с типом погружения. [IMG] http://i41.tinypic.com/33vc5rs.jpg[/IMG]

Глубина бункера поступают из отдельного набора данных, содержащего добычу информации:

enter image description here

У меня есть следующие коды, которые работают для данных погружений в целом, но нужно, чтобы написать или включить функцию приложения, чтобы я мог запускать ее для данных для каждого погружения, содержащегося в одном файле. Итак, для кита с 40 погружениями мне нужно 40 частот китов, 40 китовых китов, 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)) 

ОБНОВЛЕНИЕ Я приклеил данные примера для обоих копытных и китов погружений.

Prey данные

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 

Whale данные:

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

Извините. Я ошибочно вставил более старую версию кода. В процессе бурения глубины погружения «кит» должен равняться «погружению». На данный момент я не на своем офисном компьютере, поэтому не имею доступа к моим данным. Я буду макетировать некоторые данные в бит и repost, если вышеуказанное разъяснение не поможет. Благодаря! – akbreezo

ответ

1

Дайте этот код попробовать. Я проверил это на данных, которые вы опубликовали. Я использовал глубины из кадра данных жертвы. Не уверен, что это то, что вы хотели сделать. И на этот раз я догадался, что вы использовали кит $ Dive для своего погружения. Если нет, вам придется это изменить. (Обратите внимание, этот вопрос был подвергнут перекрестным размещено в список г-помощи тоже.)

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, depth, fish, zoop)): попытка применить нефункцию». – akbreezo

+0

Я отредактировал свой ответ после проверки его данных. Сделал несколько изменений. Кажется, сейчас работает. В 'sapply()' function, 'dat' является псевдонимом, который я дал каждому элементу списка' dives'. Возможно, вам захочется ознакомиться с функциями 'lapply()' и 'sapply()'. –

+0

Работа! Спасибо! – akbreezo