2009-10-12 8 views
1

저는 SAS에서 주로 일해 왔지만 RI와의 친숙 함을 잃고 싶지는 않습니다. 뭔가 복제하고 싶습니다. 내가 한 기본. SAS 코드가 완벽하지 않으면 용서할 수 있습니다. 집에 SAS가 없기 때문에 메모리에서이 작업을하고 있습니다. SAS에서 R에서 Data.frames로 작업하기 (원하는 것을 설명하기 위해 SAS 코드 사용) r

나는 대략 다음의 예처럼 데이터 집합을 가지고 (. SAS의 NA의 것과 동일)

A B 
1 1 
1 3 
0 . 
0 1 
1 0 
0 0 

데이터 세트 위에서 그럼 내가 다음과 같은 뭔가를 할 수 work.foo 경우.

/* create work.bar from dataset work.foo */ 
data work.bar; 
set work.foo; 

/* generate a third variable and add it to work.bar */ 
if a = 0 and b ge 1 then c = 1; 
if a = 0 and b = 0 then c = 2; 
if a = 1 and b ge 1 then c = 3; 
if a = 1 and b = 0 then c = 4; 
run; 

내가 얻을 것이라고 뭔가

A B C 
1 1 3 
1 3 3 
0 . . 
0 1 1 
1 0 4 
0 0 2 

추천하고 그때 그때 시저의 C 정렬 및 4 개 하위 그룹을 만들 C를 사용하여 다양한 작업을 수행 할 수있다. 예를 들어 나는

proc means noprint data =work.bar; 
by c; 
var a b; 
output out = work.means mean(a b) = a b; 
run; 

각 그룹의 수단을 얻을 수 나는 work.means라는 그룹에 의해 변수의 데이터를 얻을 것 같은 일 : 나는 또한 얻을 수 있습니다 생각

C A B 
1 0 1 
2 0 0 
3 2 2 
4 1 0 

a. 행,하지만 내 목적을 위해 그것에 대해 상관 없어.

이제 R에서 동일한 데이터 세트를 올바르게 읽었지만 CC (예 : CC)와 같이 변수를 추가하는 방법이나 하위 그룹에서 작업을 수행하는 방법을 모릅니다. proc 수단에서 cc 명령). 또한, 필자는 변수가 어떤 순서로든 지명되지는 않았지만 그 변수가 나타내는 것에 따라주의해야합니다.

나는 누군가가 나에게 위의 방법을 보여줄 수 있다고 생각한다. 내가해야 할 일을 일반화 할 수있다.

답변

4

데이터 세트가 변수 a와 b를 가진 work.foo라는 2 열 데이터 프레임이라고 가정합니다. 그런 다음, 다음 코드는 R에서 할 수있는 한 가지 방법은 다음과 같습니다

work.bar <- work.foo 
work.bar$c <- with((a==0 & b>=1) + 2*(a==0 & b==0) + 3*(a==1 & b>=1) + 
       4*(a==1 & b==0), data=work.foo) 
work.mean <- by(work.bar[,1:2], work.bar$c, mean) 
4

대안은 plyr 패키지에서 ddply()을 사용하는 것입니다 - 당신도 반드시, 그룹 변수를 만들 필요가 없습니다 것 (즉, 몹시 편리하지만) . 당신이 그룹화 변수가 있다면 물론

ddply(work.foo, c("a", "b"), function(x) c(mean(x$a, na.rm = TRUE), mean(x$b, na.rm = TRUE)) 

, 당신은 단지 "c"c("a", "b")을 대체 할 것입니다.

내 마음에 가장 큰 장점은 plyr 함수가 원하는 모든 종류의 객체를 반환한다는 것입니다. ddply는 데이터 프레임을 가져 와서 하나를 돌려주고, dlply는 목록을 반환합니다. by() 및 그 * 대개의 경우 형제를 적용합니다. 당신에게 목록을 줘. 나는 생각한다.