2010-04-16 6 views
1

각 열 의 log-differences을 계산하고 행 id을 제어하여 data.frame을 변환하려고합니다. 그래서 기본적으로 각 id의 변수에 대한 성장률을 계산하고 싶습니다. 그래서 여기 은 ID 열, 기간 콜럼 p와 세 개의 변수 열이있는 임의 DF입니다 : 지금은 내가 원하는 않습니다 정확히 어떤 함수를 작성했습니다로그 차이를 적용하여 성장률 계산

df <- data.frame (id = c("a","a","a","c","c","d","d","d","d","d"), 
        p = c(1,2,3,1,2,1,2,3,4,5), 
        var1 = rnorm(10, 5), 
        var2 = rnorm(10, 5), 
        var3 = rnorm(10, 5) 
       ) 
df 
    id p  var1  var2  var3 
1  a 1 5.375797 4.110324 5.773473 
2  a 2 4.574700 6.541862 6.116153 
3  a 3 3.029428 4.931924 5.631847 
4  c 1 5.375855 4.181034 5.756510 
5  c 2 5.067131 6.053009 6.746442 
6  d 1 3.846438 4.515268 6.920389 
7  d 2 4.910792 5.525340 4.625942 
8  d 3 6.410238 5.138040 7.404533 
9  d 4 4.637469 3.522542 3.661668 
10 d 5 5.519138 4.599829 5.566892 

하지만은 우회을했다 아마도 불필요하며 제거 될 수 있습니다. 그러나 어쨌든 바로 가기를 찾을 수 없습니다.

fct.logDiff <- function (df) { 
df.log <- dlply (df, "code", function(x) data.frame (p = x$p, log(x[, -c(1,2)]))) 
list.nalog <- llply (df.log, function(x) data.frame (p = x$p, rbind(NA, sapply(x[,-1], diff)))) 
ldply (list.nalog, data.frame) 
} 

fct.logDiff(df) 
    id p  var1  var2  var3 
1  a 1   NA   NA   NA 
2  a 2 -0.16136569 0.46472004 0.05765945 
3  a 3 -0.41216720 -0.28249264 -0.08249587 
4  c 1   NA   NA   NA 
5  c 2 -0.05914281 0.36999681 0.15868378 
6  d 1   NA   NA   NA 
7  d 2 0.24428771 0.20188025 -0.40279188 
8  d 3 0.26646102 -0.07267311 0.47041227 
9  d 4 -0.32372771 -0.37748866 -0.70417351 
10 d 5 0.17405309 0.26683625 0.41891802 

의 문제점이 첨가 NA -rows 때문이다 : 여기 기능과 배치 데이터 프레임의 출력이다. 나는 프레임을 무너 뜨리고 그것을 줄이기를 원하지 않는다. 이것은 자동으로 diff() 함수에 의해 수행 될 것이다. 그래서 원래 프레임에 10 개의 행이 있었고 변환 후 동일한 양의 행을 유지합니다. 같은 길이를 유지하기 위해 나는 NAs을 더해야했다. data.frame을리스트로 변환하고 각 id의 첫 번째 라인에 NAs을 추가 한 후 우회하여 data.frame으로 다시 변환합니다. 그것은 지루해 보입니다.

data.frame-list-data.frame 클래스 변환을 피하고 함수를 최적화하려면 어떤 아이디어라도 필요합니까?

답변

2

어때?

nadiff <- function(x, ...) c(NA, diff(x, ...)) 
ddply(df, "code", colwise(nadiff, c("var1", "var2", "var3"))) 
+0

@hadley nice, works fine! 필자는 항상 apply 함수 중 하나를 기본 패키지 함수 중 하나와 결합하려고 시도했습니다. 그리고 나는 당신의 플라이어 패키지를 한번 더 들여다 봐야했다. 전에 colwise 함수를 사용하지 않았습니다. 감사! – mropa

관련 문제