2012-01-01 2 views
2

데이터 프레임의 모든 열에 차이와 백분율 변경을 추가하고 싶습니다.데이터 프레임의 모든 열의 차이와 변화율을 추가 하시겠습니까?

데이터를 녹여 계산을 수행 할 수는 있지만이를 다시 캐스팅하거나 다시 형성하는 방법을 알 수는 없습니다. 또한 이것은 플라이어으로 쉽게 수행 할 수 있지만, n-1 개의 행은 diff()으로 반환된다는 문제가 있습니다.

library(plyr) 
library(quantmod) 
head(longley) 

    GNP.deflator  GNP Unemployed Armed.Forces Population Year Employed 
1947   83.0 234.289  235.6  159.0 107.608 1947 60.323 
1948   88.5 259.426  232.5  145.6 108.632 1948 61.122 
1949   88.2 258.054  368.2  161.6 109.773 1949 60.171 
1950   89.5 284.599  335.1  165.0 110.929 1950 61.187 
1951   96.2 328.975  209.9  309.9 112.075 1951 63.221 
1952   98.1 346.999  193.2  359.4 113.270 1952 63.639 

longley.m <- melt(longley, id="Year") 
longley.m <- ddply(longley.m, .(variable), transform, valdiff=diff(c(NA, value)), valdelt=Delt(value)) 

head(longley.m) 

    Year  variable value valdiff Delt.1.arithmetic 
1 1947 GNP.deflator 83.0  NA    NA 
2 1948 GNP.deflator 88.5  5.5  0.066265060 
3 1949 GNP.deflator 88.2 -0.3  -0.003389831 
4 1950 GNP.deflator 89.5  1.3  0.014739229 
5 1951 GNP.deflator 96.2  6.7  0.074860335 
6 1952 GNP.deflator 98.1  1.9  0.019750520 

이제 (삼각근이 자신의 열 이름입니다 만드는 이유를 모르겠어요,하지만 난 그것에 포기했습니다), 내가 cast(longley.m, Year ~ variable) 얻을 수는 포함 된 데이터 집합을 사용

원래 데이터 세트로 돌아가지만 각 변수에 대해 수동으로 계산을 수행하지 않고 다른 열의 각 변수에 대한 차이와 백분율을 변경할 수 있기를 원합니다. 나는 ... 나는 아무 소용이 캐스트의 모든 변화를 시도했다 꽤 확신

업데이트 : Joran는 DELT 열 명명 문제를 해결 : as.vector 그것을 강요!

+0

그것은 무엇입니까?내 문제는 모든 열에서 동일한 작업을 수행하고 다시 데이터 프레임에 넣는 것입니다. 거기에 대한 해결책이 보이지 않습니다. – Totovader

+0

나는 어려움의 근원을 이해하지 못했다고 생각한다. 나는 unvote하기 위해 내가 할 수있는 것을 본다. –

답변

2

내가 가능성이 @joran처럼이 더 접근 것입니다. 지표의 범주 내에서

# Your code 
library(plyr) 
library(quantmod) 
library(reshape) 
head(longley) 
longley.m <- melt(longley, id="Year") 

# My addition 
longley.m <- ddply(longley.m, .(variable), transform, 
        valdiff = diff(c(NA, value)), 
        valdelt = as.vector(Delt(value))) 
reshape(longley.m, idvar="Year", timevar="variable", direction="wide") 
+0

이것이 내가 찾던 것을 정확하게 제공한다고 생각합니다. 변형이 나를 위해 클릭하지 못했습니다. 고맙습니다! – Totovader

+1

Heh. 많은 사람들이 '재구성'에 대한 경험이 있습니다. –

2

Delt을 사용할 때 이상한 열 이름을 사용하는 이유는 vector가 아닌 matrix를 반환하기 때문입니다. as.vector으로 강요하면 그 수수께끼가 풀립니다.

그러나 나는 이것이 너무 복잡하다고 생각합니다. 단순히 연도별로 데이터 프레임을 정렬 할 수없고 각 열에 diffDelt을 적용하고 열의 이름을 적절히 변경 한 다음 cbind을 함께 사용하는 이유가 있습니까?

일부 스타터 코드 :

longley.o <- arrange(longley,Year) 
apply(longley.o,2,function(x){c(NA,diff(x))}) 
apply(longley.o,2,Delt) 

더 완벽한 버전 (열없이 손 입주) :

longley.o <- arrange(longley,Year) 
valdiff <- apply(longley.o,2,function(x){c(NA,diff(x))}) 
valdelt <- apply(longley.o,2,Delt) 

colnames(valdiff) <- paste("valdiff",colnames(valdiff),sep = ".") 
colnames(valdelt) <- paste("valdelt",colnames(valdelt),sep = ".") 

out <- cbind(longley.o, 
      valdiff[,-match("Year",colnames(longley.o))], 
      valdelt[,-match("Year",colnames(longley.o))]) 
+0

첫 번째 수수께끼를 해결해 주셔서 감사합니다! 비록 내가 복잡한 일을하는 경향이 있지만,이 경우 나는 올바른 길을 가고 있다는 느낌이 든다. 단순히 각 열의 diff 및 Delt를 수행하는 문제는 (내가 녹이기 전에) 각 변수에 대해 매년마다 필요합니다. 솔루션의 각 열을 명시 적으로 입력해야합니다. 내 실제 문제는 약 12 ​​개의 서로 다른 데이터 프레임에 20 개 이상의 열이 있으므로 쉬운 방법을 찾고 있습니다. – Totovader

+0

@Totovader 나는 당신의 추론을 정말로 따르지 않습니다. 오히려 재구성을 사용하고 싶다면 조쉬가 당신을 덮었습니다. 위의 업데이트는 그의 답변과 동일한 결과를 제공해야합니다. – joran

+0

나는 당신이 가고있는 곳을 보았습니다. 지금 당신의 cbind 부분의 일치 부분은 제게 외국적입니다. 그래서 몇 가지 추가 단계가있었습니다. – Totovader

0

내가 녹는의 전략을 생각하고 처리 : 당신은 당신이에 있던 경로를 따라 계속하려면

, 당신은 여행을 완료하기 위해 기본 R에서 reshape()을 사용할 수 있습니다 불필요하게 복잡했습니다. (같은

as.data.frame(lapply(longley, function(x) c(NA, diff(x)))) 

또는 모든 항목이 숫자라고 알고있는 경우 :은 행 번호와 일치 할 수 있도록 당신이 시작에서 NA의의 추가 된 행과 dataframe를 원하는 경우 두 가지 대안 중 하나 라이너로 자신을 제안

apply(longley,2, FUN=function(x) c(NA, diff(x))) 

그리고 당신은 삼각근과 모두 함께 다음을 원한다면 결과 : 숫자 기능의 사용에 의해 제안) 때문에 apply를 사용하여와 OK있는 것은 다음이 방법도 간단하다

cbind(apply(longley,2, FUN=function(x) c(NA, diff(x))), 
     apply(longley,2, Delt)) 
관련 문제