2014-09-01 4 views
3

tapply 결과를 원래 데이터 프레임에 새 열로 추가하고 싶습니다. 나는 열로 데이터 프레임에 각 범주의 평균을 추가하고 싶은기존 데이터 프레임에 tapply 결과를 추가하는 방법

dat <- read.table(text = " category birds wolfs  snakes 
        yes  3  9   7 
        no   3  8   4 
        no   1  2   8 
        yes  1  2   3 
        yes  1  8   3 
        no   6  1   2 
        yes  6  7   1 
        no   6  1   5 
        yes  5  9   7 
        no   3  8   7 
        no   4  2   7 
        notsure 1  2   3 
        notsure 7  6   3 
        no   6  1   1 
        notsure 6  3   9 
        no   6  1   1 ",header = TRUE) 

:

여기 내 데이터 프레임이다. 나는 카테고리 당 평균을 얻기 위해 tapply(dat$birds, dat$category, mean)을 사용했지만, 나는 그것을 새로운 카테고리의 데이터 세트에 추가 할 방법을 찾지 못했다.

답변

6

당신은 당신이 tapply

mbirds1 <- with(dat, tapply(birds, category, mean)) 
    dat$mbirds1 <- mbirds1[match(dat$category,names(mbirds1))] 

    head(dat) 
    # category birds wolfs snakes mbirds mbirds1 
#1  yes  3  9  7 3.200 3.200 
#2  no  3  8  4 4.375 4.375 
#3  no  1  2  8 4.375 4.375 
#4  yes  1  2  3 3.200 3.200 
#5  yes  1  8  3 3.200 3.200 
#6  no  6  1  2 4.375 4.375 

를 사용하려면 base

dat$mbirds <- with(dat, ave(birds, category, FUN=mean)) 

에서 ave를 사용하거나 여기

library(data.table) 
setDT(dat)[,mbirds1:= mean(birds), by=category] 
+0

고마워요 @akrun 그것이 작동합니다 .. –

+0

@migdal menora 당신을 위해 일해 주어서 기뻐요 – akrun

1

당신은 here를 찾을 수 있습니다 dplyr 패키지에 대한이

dat <- dat %>% group_by(category) %>% mutate(mbirds=mean(birds))

더 많은 정보와 같은 dplyr 패키지와 함께 쉽게 그것을 달성 할 수있다.

다른 패키지와의 접근법은 akrun의 답변에서 찾을 수 있습니다.

+0

@iugrina에게 감사드립니다. 그러나 이름을 쓸 때 (dat) 새 변수 "mbirds"를 얻지 못합니다. 원본 데이터 프레임에 어떻게 추가 할 수 있습니까? 또 다른 두 가지 질문이 있습니다. %> %의 의미는 무엇입니까? 또한 dplyr 패키지가 없어도이를 수행 할 수있는 아이디어가 있습니까? –

+0

나는 나의 대답을 조정할 것이다 – iugrina

3

aggregate 대답 빠른 될 것이라고 data.table을 사용할 수 있습니다 . 인수에 공식을 사용하면 멋지고 단순 해집니다.

> a <- aggregate(birds~category, dat, mean) 
> cb <- cbind(dat, mean = a[,2][match(dat[[1]], a[,1])]) 
> head(cb) 
# category birds wolfs snakes mean 
#1  yes  3  9  7 3.200 
#2  no  3  8  4 4.375 
#3  no  1  2  8 4.375 
#4  yes  1  2  3 3.200 
#5  yes  1  8  3 3.200 
#6  no  6  1  2 4.375 
+0

Richard .. –

관련 문제