2013-10-29 4 views
1

루프를 간단한 빼기 함수와 결합하는 값의 새 벡터를 만들려고합니다.중첩 된 조건 루프

내 데이터 : 날짜 당 48 회의 관측치가 있고 그 중 24 개의 관측치가 '치료'로 지정되어 있고 24 개가 '제어'입니다 (따라서 매일 24 쌍이 있고 각 쌍 내에 하나씩 치료됨 하나는 컨트롤 역할을합니다).

제어 및 처리 플럭스 값의 차이 인 새로운 변수를 만들고 싶습니다. (따라서 각 플럭스 세트 내의 제어 플럭스보다 처리 플럭스의 정량적 효과를 격리하지만) 다른 모든 메타 데이터를 유지합니다. 날짜, 페어 세트 등). 나는 모두 CO2 플럭스 (CO2_mg.m2.h)와 CH4 플럭스에 대한 코드 세트를 만들 필요가

date collar setID withinset CH4_mg.m2.h CO2_mg.m2.h 
6/20/2013 1 1 t 0.557704455 2930.10525 
6/20/2013 2 1 c 0.49434559 2823.564824 
6/20/2013 1S 2 c 2.205589818 2014.835162 
6/20/2013 2S 2 t 2.854174288 1996.614314 
6/20/2013 3 3 c 4.548922035 1818.766532 
6/20/2013 4 3 t 2.352010011 1575.160171 
6/20/2013 3S 4 c 1.022583517 1289.122553 
6/20/2013 4S 4 t 4.377283389 2888.582123 
6/20/2013 5 5 t 1.340228189 2636.685313 
6/20/2013 6 5 c 1.1954218 1782.670702 
6/20/2013 5N 6 c 4.217147165 1631.184251 
6/20/2013 6N 6 t 1.836410187 1031.5654 
6/20/2013 7 7 t 2.051102645 2609.285292 
6/20/2013 8 7 c 1.96837465 2454.56188 
6/20/2013 7N 8 c 3.66876257 2253.766863 
6/20/2013 8N 8 t 3.460709848 2853.823753 
6/20/2013 9 9 t 1.084707894 771.0890746 
6/20/2013 10 9 c 1.915678246 857.8528567 
6/20/2013 9S 10 c 3.555408983 569.5288078 
6/20/2013 10S 10 t 3.401276615 588.6532344 
6/20/2013 11 11 c 2.970877855 1324.872897 
6/20/2013 12 11 t 2.028830249 956.9233078 
6/20/2013 11S 12 t 8.063764267 1516.712685 
6/20/2013 12S 12 c 4.160007577 986.7419756 
6/20/2013 13 13 c 8.351615925 1484.538885 
6/20/2013 14 13 t 7.682825572 1573.40649 
6/20/2013 13N 14 c 6.688854043 1400.82208 
6/20/2013 14N 14 t 4.426522661 985.5632563 
6/20/2013 15 15 c 2.240328624 467.566316 
6/20/2013 16 15 t 2.395533405 470.3854269 
6/20/2013 15N 16 c 3.145509032 1053.025448 
6/20/2013 16N 16 t 3.989964648 1602.760702 
6/20/2013 17 17 t 3.117849324 656.6618375 
6/20/2013 18 17 c 3.719289098 575.5902064 
6/20/2013 17S 18 t 2.75248536 914.3974523 
6/20/2013 18S 18 c 3.253130586 906.1170518 
6/20/2013 19 19 c 2.068481806 465.0783511 
6/20/2013 20 19 t 6.696415968 1362.594187 
6/20/2013 19N 20 t 3.25099946 437.389186 
6/20/2013 20N 20 c 2.923361538 504.803891 
6/20/2013 21N 21 t 5.704969796 1190.943268 
6/20/2013 22N 21 c 7.014650089 1550.961323 
6/20/2013 23S 22 c 6.277550864 1408.528849 
6/20/2013 24S 22 t 8.3399388 1573.475572 
6/20/2013 21 23 c 7.722659069 1467.822676 
6/20/2013 22 23 t 12.51091848 1276.049909 
6/20/2013 23 24 t 10.81073531 2052.516537 
6/20/2013 24 24 c 0.797904749 884.0794505 

(CH4_mg.m2.h을 :

처럼 내 데이터의 어느 날 모습입니다),하지만 일단 기본 스켈레톤 코드가 작동하면 복제가 쉬워야합니다.

이 CH4 내 시도 코드는 다음과 같습니다

t_minus_c <- rep(0,37) # 37 dates 
    for (i in 1:37){ 
    for (j in 1:24){ #24 collar pairs, aka setID 
    {tmc[i] <- ((data$CH4_mg.m2.h[which(data$date==i & data$setID==j & withinset=="t"),]) - 
    (data$CH4_mg.m2.h[which(data$date==i & data$setID==j & withinset=="c"),]))} 
    } 
} 

내가 모두 CO2 플럭스 (CO2_mg.m2.h)와 별도로 CH4 플럭스 (CH4_mg.m2.h)에 대한 코드 세트를 확인해야합니다.

나는 그것이 clunky다는 것을 알고, 어떤 도움도 크게 감사하겠습니다. 미리 감사드립니다.

답변

0

당신은 data.table 대신 data.frame의 사용을 고려할 수 있습니다. 이 작업은 매우 쉽고 우아하게 할 수 있습니다.

데이터가 data.frameDT이라고 가정합니다.

require(data.table) 
DT <- data.table(DF) 
setkey(DT, date, setID, withinset) #order data by date, then setID and then withinset 
TMP <- DT[, list(CH4 = diff(CH4_mg.m2.h), CO2 = diff(CO2_mg.m2.h)), by=list(date, setID)] 
TMP 

출력

전자 data.table DT 위해 넣어
  date setID   CH4   CO2 
1: 6/20/2013  1 0.06335886 106.540426 
2: 6/20/2013  2 0.64858447 -18.220848 
3: 6/20/2013  3 -2.19691202 -243.606361 
4: 6/20/2013  4 3.35469987 1599.459570 
5: 6/20/2013  5 0.14480639 854.014611 
6: 6/20/2013  6 -2.38073698 -599.618851 
7: 6/20/2013  7 0.08272799 154.723412 
8: 6/20/2013  8 -0.20805272 600.056890 
9: 6/20/2013  9 -0.83097035 -86.763782 
10: 6/20/2013 10 -0.15413237 19.124427 
11: 6/20/2013 11 -0.94204761 -367.949589 
12: 6/20/2013 12 3.90375669 529.970709 
13: 6/20/2013 13 -0.66879035 88.867605 
14: 6/20/2013 14 -2.26233138 -415.258824 
15: 6/20/2013 15 0.15520478 2.819111 
16: 6/20/2013 16 0.84445562 549.735254 
17: 6/20/2013 17 -0.60143977 81.071631 
18: 6/20/2013 18 -0.50064523 8.280401 
19: 6/20/2013 19 4.62793416 897.515836 
20: 6/20/2013 20 0.32763792 -67.414705 
21: 6/20/2013 21 -1.30968029 -360.018055 
22: 6/20/2013 22 2.06238794 164.946723 
23: 6/20/2013 23 4.78825941 -191.772767 
24: 6/20/2013 24 10.01283056 1168.437087 
     date setID   CH4   CO2 

, DT[i,j,by] 그룹화하여 제공 조건 i 만족 DT에서 행을 선택하고 각 그룹리스트 j에 지정 계산을 사용하여 열을 생성 할 것이다 변수는 목록 by에 의해 제공됩니다. 이것은 data.table의 작동 방식에 대한 대략적인 설명입니다. 더 나은 이해를 위해 data.table 매뉴얼을 읽어야합니다.

+0

참고로, 합의에 따르면 답변에 data.table을 사용하여 태그 다시 지정에 반대하는 것으로 보입니다. http://chat.stackoverflow.com/rooms/106/conversation/data-table-tagging – Frank

+0

@Frank 괜찮습니다. 태그를 제거했습니다. –

+0

정말 고마워요! 이것은 나를 위해 일했습니다. – user2930281