2012-05-25 4 views
0

다른 데이터 프레임을 형성하기 위해 데이터 프레임을 하나씩 추가하려면 어떻게해야합니까? 데이터 프레임 포함 여부는 조건에 따라 결정됩니다. 여기 함수를 기반으로 데이터 프레임 추가 R

는 예시적인 데이터이다

지금
d1 <- data.frame(MyGroups =sample(LETTERS,100,replace=TRUE), 
       MyInt = sample(c(1:20),100,replace=TRUE)) 

, I (10)보다 큰 가변 민트의 평균이 MyGroups에서 그룹 (A, B, C를 ...)을 선택해야하는지?

나는 다음과 같은 시도를 성공적으로 시도했다. 여기서는 주어진 기준에 따라 데이터 프레임을 파일에 추가하려고합니다. 원하는 데이터 프레임 파일에 있어야합니다

require("plyr") 

keepGrp <- function(df0) { 
    if(max(df0$MyInt < 10)) {df0 <- NULL} 
    write.csv(df0,'mytable.txt',append=TRUE,sep=',') 
} 

ddply(d1,.(MyInt),function(x) keepGrp(x)) 

내가 할 노력하고 무엇을 할 수있는 더 좋은 방법이 완전히 확신 mytable.txt. 그렇게해야 할 경우 제 질문을 명확하게 설명해 드리겠습니다. 나는 (1) 내 프로그래밍 아이디어를 개선하는 것에 대한 의견을 보여줄 수있는 사람 (2)이 내 문제에 대한 해결책을 줄 수 있음을 인정할 것이다.

+0

data.frame을 만들거나 파일을 만드는 것이 목표입니까? 질문은 data.frame에 대해 묻는 것으로 시작하지만 파일에 대해 묻는 것으로 끝납니다. –

+0

'rbind'를 확인 했습니까? – betabandido

+0

데이터 프레임을 원했지만 그 방법을 모릅니다. 내가 생각할 수있는 유일한 방법은 ddply를 사용하여 결과를 파일로 보낸 다음 해당 파일에서 데이터 프레임을 가져 오는 것입니다. –

답변

1

질문을 제대로 이해하면 그룹별로 평균을 계산하고 특정 임계 값을 만족하는 값을 기존 파일에 쓰고 싶을 것입니다. 그렇다면 왜 모든 수단을 한꺼번에 계산하고 하위 집합을 작성한 다음 그 값을 써야합니까? 여기에 아마 배수로 분할해야 한 라이너,하지만 난 당신이 포인트를 얻을 수있을 거라 생각 :

write.table(
    subset(
    ddply(d1, "MyGroups", transform, meanval = mean(MyInt) 
     ), 
    meanval > 10), 
    "yourcsv.csv", append = TRUE, sep = ",", col.names = FALSE 
) 
+0

그래서 요약하면 :'transform'을 사용하여 열을 만든 다음'subset'을 사용하여 행을 필터링하십시오. –

1

당신이 그것을 만드는 것보다 그것은 간단하다. ddply이 호출하는 함수는 조건이 충족되면 데이터의 하위 집합을 반환하거나 그렇지 않으면 빈 data.frame을 반환 할 수 있습니다.

keepGrp <- function(df0) { 
    if(mean(df0$MyInt) > 10) { 
    df0 
    } else { 
    data.frame() 
    } 
} 

res <- ddply(d1, .(MyGroups), keepGrp) 

keepGrp 안에 당신의 검사 결과가 잘못 참고합니다 (MyInt 값의 평균을 테스트하지 않았다)와 ddply의 그룹화 (MyGroups하지 MyInt해야한다) 잘못이었다.

이 잘임을 확인 :

> ddply(d1, .(MyGroups), summarise, ave = mean(MyInt)) 
    MyGroups  ave 
1   A 14.200000 
2   B 9.600000 
3   C 5.600000 
4   D 5.600000 
5   E 8.000000 
6   F 10.500000 
7   G 7.333333 
8   H 12.000000 
9   I 7.333333 
10  J 9.500000 
11  K 11.000000 
12  L 12.375000 
13  M 13.250000 
14  N 12.000000 
15  O 11.666667 
16  P 8.625000 
17  Q 13.000000 
18  R 6.000000 
19  S 16.000000 
20  T 12.000000 
21  U 12.000000 
22  V 13.250000 
23  W 17.666667 
24  X 9.000000 
25  Y 12.400000 
26  Z 13.750000 
> unique(res$MyGroup) 
[1] A F H K L M N O Q S T U V W Y Z 
Levels: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 

그래서 res에 나타나는 사람이 MyInt에 해당하는 평균 값이 그들이다.

+0

+1 for data.frame() 그리고 ddply의 그룹화가 잘못되었습니다 ** –

관련 문제