2

それが私のデータフレームです

Colour = c("red",   "blue", "red",  "blue", "yellow",   "green",    "red",  "blue", "green",    "red",  "yellow",   "blue")
Volume  = c(46,46,57,57,57,57,99,99,99,111,111,122)
Cases   = c(7,2,4,2,3,5,1,2,3,2,4,1)
df = data.frame(Colour, Volume, Cases)

"red"Color がOR"blue"で Volume が同一のケースを合計したい。指定されていない色は保持する必要があります。赤と青が異なるために合計できない場合はVolume、それらも保持する必要があります

結果は次のようになります。

Colour = c("red_or_blue","red_or_blue","yellow","green","red_or_blue","green","red","yellow","blue")
Volume  = c(46,57,57,57,99,99,111,111,122)
Cases   = c(9,6,3,5,3,3,2,4,1)
df_agg = data.frame(Colour, Volume, Cases)

"red_or_blue"赤または青の行に を割り当て、残りの行に x を割り当てる列をさらに作成する方法を見つけました。次に、集計を使用しました:

df$test = ifelse(df$Colour %in% c("red", "blue"),"red_or_blue","x")
df_agg = aggregate(df$Cases, list(df$Volume, df$test), sum)

それは機能しますが、これは少し面倒だと思いました。余分な列の作成をスキップするより便利な方法はありますか? 将来的には、赤/青とボリューム 57/99 のケースを合計する必要があります。余分な列があると、少し扱いに​​くくなるようです。

また、元の色が赤でも青でもないと引き継がれませんでした。私はこの方法で試しましたが、うまくいきません:

df$test = ifelse(df$Colour %in% c("red", "blue"),"red_or_blue",df$Colour)

乾杯、ポール

4

2 に答える 2

1

ベースRに固執する方法を次に示します(ただし、おそらく最も効率的な方法ではありません....)

  1. 次の方法でデータをグループに分割しますVolume

    temp = split(df, df$Volume)
    
  2. 「赤」と「青」が存在するグループでのみ「赤」と「青」の値を変更するクイック関数を作成します。

    red.and.blue = function(x) {
      if (sum(c("red", "blue") %in% x$Colour) > 1) {
        x$Colour = gsub("red|blue", "red-and-blue", x$Colour)
      } else {
        x$Colour = as.character(x$Colour)
      }
      x
    }
    
  3. tempステップ 1 で作成したオブジェクトでその関数を使用します。

    temp = lapply(temp, red.and.blue)
    
  4. aggregate()必要な集計を実行するために使用します。aggregate()元の列名を維持できるように、引数に名前を指定します。

    temp = lapply(temp, function(x) aggregate(list(Cases = x$Cases), 
                                              list(Colour = x$Colour, 
                                                   Volume = x$Volume), sum))
    
  5. すべてを に戻しますdata.frame()。そのまま保存する場合は、名前を付けることを忘れないでください。

    do.call(rbind, temp)
    #             Colour Volume Cases
    # 46    red-and-blue     46     9
    # 57.1         green     57     5
    # 57.2  red-and-blue     57     6
    # 57.3        yellow     57     3
    # 99.1         green     99     3
    # 99.2  red-and-blue     99     3
    # 111.1          red    111     2
    # 111.2       yellow    111     4
    # 122           blue    122     1
    
于 2012-08-17T08:21:06.693 に答える
0

@mrdwabのアプローチに従えばsapply、各「分割ボリューム」で使用できると思います

df$Cases <- sum(df[(df$Colour =='blue' | df$Colour == 'red'),][,3])

ケース数を取得し、

df$Colour[(df$Colour =='blue' | df$Colour == 'red')] <- 'readandblue'

色名を変更します。を使用した 2 行のソリューションがあることも確信してddplyいますが、私はそのツールの専門家ではありません (まだ)。

于 2012-08-17T12:24:04.113 に答える