2013-06-25 2 views
0

I 다음 dataframe 있습니다R - 여러 다른 요소의 열을 기반으로 합산 열

df<-structure(list(totprivland = c(175L, 50L, 100L, 14L, 4L, 240L, 
10L, 20L, 20L, 58L), ncushr8d1 = c(0L, 0L, 0L, 0L, 0L, 30L, 5L, 
0L, 0L, 50L), ncu_CENREG1 = structure(c(4L, 4L, 4L, 4L, 1L, 3L, 
3L, 3L, 4L, 4L), .Label = c("Northeast", "Midwest", "South", 
"West"), class = "factor"), ncushr8d2 = c(75L, 50L, 100L, 14L, 
2L, 30L, 5L, 20L, 20L, 8L), ncu_CENREG2 = structure(c(4L, 4L, 
4L, 4L, 1L, 2L, 1L, 4L, 3L, 4L), .Label = c("Northeast", "Midwest", 
"South", "West"), class = "factor"), ncushr8d3 = c(100L, NA, 
NA, NA, 2L, 180L, 0L, NA, NA, NA), ncu_CENREG3 = structure(c(4L, 
NA, NA, NA, 1L, 1L, 3L, NA, NA, NA), .Label = c("Northeast", 
"Midwest", "South", "West"), class = "factor"), ncushr8d4 = c(NA, 
NA, NA, NA, 0L, NA, NA, NA, NA, NA), ncu_CENREG4 = structure(c(NA, 
NA, NA, NA, 1L, NA, NA, NA, NA, NA), .Label = c("Northeast", 
"Midwest", "South", "West"), class = "factor")), .Names = c("totprivland", 
"ncushr8d1", "ncu_CENREG1", "ncushr8d2", "ncu_CENREG2", "ncushr8d3", 
"ncu_CENREG3", "ncushr8d4", "ncu_CENREG4"), row.names = c(27404L, 
27525L, 27576L, 27822L, 28099L, 28238L, 28306L, 28312L, 28348L, 
28379L), class = "data.frame") 

=======

다음과 같은 기본 개념에 대한 dput입니다 :

Total VariableA LocationA VariableB  LocationB 
30   20  East   10   East 
20   20  South   NA   West 
115   15  East   100   South 
100   50  West   50   West 
35   10  East   25   South 

총계 (또는 입력 예제의 총계)는 변수 (ncushr8d1, ncushr8d2, ncushr8d3 및 ncushr8d4)의 합계이며 각 변수는 해당 요소 위치 변수 (ncu_CENRE G1 등). 이 같은 패턴에는 6 개의 추가 변수와 위치가 있습니다. 위치 변수는 종종 여러 숫자 변수 (예 : 첫 번째 행과 같은 여러 개의 '동쪽'위치 값)에 대해 동일한 값입니다.

공통 위치 요소로 각 행의 값의 합계를 얻고 각 위치 합계에 대해 새 열을 생성하고 싶습니다. 그것은 NA 값을 무시하는 기능을 통해 다음과 같이 보일 것입니다 :

Total VariableA LocationA VariableB  LocationB TotalWest TotalEast TotalSouth 
30   20  East   10   East   0   30   0 
20   20  South   NA   NA   0   0   20 
115   15  East   100   South   0   15  100 
100   50  West   50   West  100   0   0 
35   10  East   25   South   0   10   25 

I 집계 및 분할을 검토 한 결과 있지만 너무 많은 열을 통해 작동하도록하는 방법을 알아낼 수 없습니다. 나는 또한 모든 "변수"와 해당 위치를 순환하는 긴 "if"문을 고려하고 있지만 이에 대한 더 나은 해결책이 있어야한다고 생각합니다. 관측치는 측량 패키지에서 사용하기 위해 가중치를 부여 받았고 나중에 관측치를 복제하여 변형 된 패키지로 "오랫동안"만드는 것을 피하고 싶습니다. 나중에 다시 결합 할 수는 있습니다. 어떤 제안도 감사드립니다! 값, 위치, 경우 :

많은 덕분에, 누가 복음

+0

을 할 수 있지만, LocationA 및 LocationB 모두 더 웨스트이 없습니다. 또한 'dput'을 사용하여 예제 데이터 집합을보다 쉽게 ​​R (R) 붙여 넣기 형식으로 사용할 수있게 할 수 있습니까? –

+0

Paul, TotalWest 열을 수정했습니다. 나는 결코 Dput을 사용하지 않았지만, 지금하려고 노력할 것입니다 ... –

답변

0

첫째, 난 당신이 3 열이있는 긴 형태로 데이터 프레임을 변환하는 것입니다. 사례는 데이터가 어떤 경우 (예 : 행)에서 왔는지 표시해야합니다. 명령은 중요하지 않습니다. 사건 번호를 추가 (쉽게)

Value Loc Case 
20  East 1 
20  South 2 
... 
10  East 1 

등 ... 그렇게하는 하나의 방법이 당신의 가치와 위치를 스택, 그리고 수동 : 그래서 당신의 데이터 프레임은 같을 것입니다. 가정 원래 dataframe은 DF라고하며

v.col = stack(df[,c(2,4)])[,1] 
v.loc = stack(df[,c(3,5)])[,1] 
v.case = rep(1:nrow(df),2) 
long.data = data.frame(v.col,v.loc,v.case) # this is not actually needed, but just so you can view it 

이제 당신은 아마거야

s = tapply(v.col,list(v.case,v.loc),sum,na.rm=T) 
new.df = cbind(df,s) 

을 필요로하는 열을 만들 tapply를 사용 3,5 열에서 열 2,4의 값과 위치를 가지고있다 NA를 0 또는 다른 것으로 조정해야하지만 이것은 쉽습니다.

plyr/reshape 패키지를 사용하여이 작업을 수행하는 것이 더 쉬운 방법 일 수도 있지만 이것에 대해서는 전문가가 아닙니다.

희망이는`TotalWest` 열 (20)의 값을 가지고, 귀하의 예제 입력의 첫 번째 행은 나에게 아무 의미

+0

안녕하세요, 작동하는 것 같습니다. 나는 팩터 화 된 위치 변수를 숫자로 변환해야만했습니다. 스택은 벡터와 만 작동하지만 그 후에는 효과가있는 것처럼 보입니다! 정말 고마워! –

관련 문제