2016-10-30 10 views
1

の値を選択して割り当てる:R - 次のようなデータフレーム持つ列に条件に基づいてグループに

d 
    year pos days sal 
1 2009 A  31 2000 
2 2009 B  60 4000 
3 2009 C  10 600 
4 2010 B  10 1000 
5 2010 D  90 7000 

をIは、yearによってグループデータたいdayssalを添加し、posを選択しますグループ内ではdaysが最大です。私はtapply(d$days, d$year, sum)のような関数を使用して、このようなdayssalなどの数値を扱うことができ

year pos days sal 
1 2009 B 101 6600 
2 2010 D 100 8000 

結果は次のようにする必要があります。

しかし、私は曜日の条件を満たすposを選択してグループに割り当てることはできません。

すべてのコメントをいただければ幸いです!

+0

dput(nameofdataframe)を使用して質問に投稿してください。 – akaDrHouse

答えて

1

dplyrを使用できます。 'year'でグループ分けした後、 'days'がmax(which.max(days))の 'pos'を取得し、 'days'と 'sal'のsumを行います。

library(dplyr) 
d %>% 
    group_by(year) %>% 
    summarise(pos = pos[which.max(days)], days = sum(days), sal = sum(sal)) 
# # A tibble: 2 × 4 
# year pos days sal 
# <int> <chr> <int> <int> 
#1 2009  B 101 6600 
#2 2010  D 100 8000 
+1

ありがとう!私はこれを探していた: – min

1

基地R有する溶液:

library(data.table) 
setDT(d)[order(days), .(pos = pos[.N], days = sum(days), sal = sum(sal)), by = year] 

得data.frame/data.table:

m1 <- d[as.logical(with(d, ave(days, year, FUN = function(x) seq_along(x) == which.max(x)) )), c('year','pos')] 
m2 <- aggregate(cbind(days, sal) ~ year, d, sum) 

merge(m1, m2, by = 'year') 

またはdata.tableパッケージと

year pos days sal 
1 2009 B 101 6600 
2 2010 D 100 8000 
0

sqldf付き:

library(sqldf) 
cbind.data.frame(sqldf('select year, sum(days) as days, sum(sal) as sal 
         from d group by year'), 
       sqldf('select pos from d group by year having days=max(days)')) 


    year days sal pos 
1 2009 101 6600 B 
2 2010 100 8000 D 
+0

これも動作します: 'sqldf(" year、pos、max(days)max_days、sum(days) –

関連する問題