2017-11-13 5 views
1

私はdata.frameをとり、ある列の値を集計し、他の列の値でソートし、最後の列の値が特定の値基準。 SQLでは、単純なGroup Byを実行してループを作成しますが、Rで始めるだけで、構文を理解するのは苦労しています。基本的に私はこのようになりますデータセットを持っている:私は、出力はこのような何かになりたいRの合計値ここで、2つの数値の間の列の値

Type Type2 Bucket Value 
    A 1  1  1 
    A 2  1  2 
    A 3  1  1 
    A 4  1  3 
    A 5  1  1 
    A 1  2  1 
    A 2  2  2 
    A 3  2  1 
    A 4  2  3 

:私の頭では

Type Type2 Bucket Value 
A  <4  1  4 
A  >=4  1  4 
A  <4  2  5 
A  >=4  2  3 

、それは簡単だが、私はSQLの背景から来ていますRでそれをやろうとしています。私は、splitやddplyのようないくつかの関数をうまく混乱させましたが、すべてをまとめて入れることはできません。ありがとう。

+0

あなたの背景がSQLである場合は、sqldf' –

+0

'のようなdplyr'以上の何かSQL-Y 'で自宅に感じるかもしれないあなたの出力の3行すべき持っています' 「5」ではなく「値= 4」? – useR

+0

あなたの助けてくれてありがとう!はい、5の代わりに4でなければなりません。私は数字を使いこなしていましたが、これを変更するのを忘れましたが、コンセプトは同じです。 –

答えて

1

dplyrでこれを行うことができます。あなたは1 Type以上を持っていると仮定すると:

library(dplyr) 

df %>% 
    group_by(Type, Bucket, Type2 = ifelse(Type2 < 4, "<4", ">=4")) %>% 
    summarize(Value = sum(Value)) %>% 
    select(Type, Type2, Bucket, Value) 

結果:

library(sqldf) 

sqldf("select Type, 
       case when Type2 < 4 then '<4' else '>=4' end as Type_2, 
       Bucket, 
       sum(Value) as Value 
      from df 
      group by Type, Bucket, Type_2") 

# A tibble: 4 x 4 
# Groups: Type, Bucket [2] 
    Type Type2 Bucket Value 
    <fctr> <chr> <int> <int> 
1  A <4  1  4 
2  A >=4  1  4 
3  A <4  2  4 
4  A >=4  2  3 

をあなたはSQLの背景を持って言及しているので、ここではあなたのためのsqldfソリューションです結果:

Type Type_2 Bucket Value 
1 A  <4  1  4 
2 A >=4  1  4 
3 A  <4  2  4 
4 A >=4  2  3 

データ:

df = structure(list(Type = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), .Label = "A", class = "factor"), Type2 = c(1L, 2L, 3L, 
4L, 5L, 1L, 2L, 3L, 4L), Bucket = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L), Value = c(1L, 2L, 1L, 3L, 1L, 1L, 2L, 1L, 3L)), .Names = c("Type", 
"Type2", "Bucket", "Value"), class = "data.frame", row.names = c(NA, 
-9L)) 
関連する問題