1

私のデータフレームには、他の2つの変数を含む各行に1つの値があります。

library(tidyverse)
df <- data_frame( car=c('A','A','A','B','B'), style=c('aa','bb','aa','aa','cc'), value=c(3,2,5,4,16) )

 car  style   value
 A     aa      3
 A     bb      2
 A     aa      5
 B     aa      4
 B     cc      16

各自動車グループ内の各スタイルの相対的な重み、およびすべてのデータに対する各スタイルの相対的な重みを見つける方法は? 目的の出力は次のとおりです (右側の # コメントは必要ありませんが、合計重量の計算を明確にするためにここに追加されています)。

 car  style   value  style_for_car   style_total     # total value count is 30
 A     aa      3         0.80            0.40         # (3+5+4)/30 = 0.40
 A     bb      2         0.20            0.067        # 2/30 = 0.067            
 A     aa      5         0.80            0.40          
 B     aa      4         0.20            0.40
 B     cc     16         0.80            0.533

以下の私の試みは、総重量の計算にのみ成功します。同じ dplyr パイプライン内で目的の出力を取得する方法:

df %>%
    group_by(style) %>%
    mutate( style_total = sum(value)/sum(.$value) )

     car  style   value   style_total
       A    aa     3       0.4000
       A    bb     2       0.0667
       A    aa     5       0.4000
       B    aa     4       0.4000
       B    cc    16       0.5333
4

1 に答える 1

2

元の回答 - 元の質問番号に基づく

いくつかの余分な行がそれをgroup_by(car)行いmutate()、計算する必要がありstyle_for_carます...

df %>%
  group_by(car) %>%
  mutate(style_for_car = value / sum(value)) %>% 
  group_by(style) %>%
  mutate( style_total = sum(value) / sum(.$value)) 

#> Source: local data frame [5 x 5]
#> Groups: style [3]
#> 
#>     car style value style_for_car style_total
#>   <chr> <chr> <dbl>         <dbl>       <dbl>
#> 1     A    aa     3           0.3  0.40000000
#> 2     A    bb     2           0.2  0.06666667
#> 3     A    aa     5           0.5  0.40000000
#> 4     B    aa     4           0.2  0.40000000
#> 5     B    cc    16           0.8  0.53333333

更新された回答 - 更新された質問番号とコメントに基づく.$

@alistaire はコメントに素敵なシングル パイプ ソリューションを入れました。追加するには、関連する情報を含む別のデータ フレームを作成し、それらを元のデータ フレームに結合する傾向があります。これにより、コードが少し読みやすくなります (少なくとも私にとっては)。これが私がそれを行う方法です(これも取り除きます.$):

# Create values for style_for_cars
df_cars <- df %>% 
             group_by(car, style) %>% 
             summarise(value = sum(value)) %>% 
             group_by(car) %>% 
             mutate(style_for_car = value / sum(value)) %>% 
             select(-value)
df_cars
#> Source: local data frame [4 x 3]
#> Groups: car [2]
#> 
#>     car style style_for_car
#>   <chr> <chr>         <dbl>
#> 1     A    aa           0.8
#> 2     A    bb           0.2
#> 3     B    aa           0.2
#> 4     B    cc           0.8

# Create values for style_total
df_total <- df %>%
              group_by(style) %>% 
              summarise(value = sum(value)) %>% 
              mutate(style_total = value / sum(value)) %>% 
              select(-value)
df_total
#> # A tibble: 3 × 2
#>   style style_total
#>   <chr>       <dbl>
#> 1    aa  0.40000000
#> 2    bb  0.06666667
#> 3    cc  0.53333333

# Join results
df %>%
  left_join(df_cars) %>% 
  left_join(df_total)
#> Joining, by = c("car", "style")
#> Joining, by = "style"
#> # A tibble: 5 × 5
#>     car style value style_for_car style_total
#>   <chr> <chr> <dbl>         <dbl>       <dbl>
#> 1     A    aa     3           0.8  0.40000000
#> 2     A    bb     2           0.2  0.06666667
#> 3     A    aa     5           0.8  0.40000000
#> 4     B    aa     4           0.2  0.40000000
#> 5     B    cc    16           0.8  0.53333333
于 2016-11-01T04:44:26.867 に答える