2017-11-09 6 views
2

性別と国家の両方でグループ化されたCumsumテーブルを取得するにはどうすればよいですか?グループ化された華やかなテーブル

Gender = sample(c('male', 'female'), 100, replace=TRUE) 
State = sample(c('CA', 'WA', 'NV', 'OR', "AZ"), 100, replace=TRUE) 
Number = sample(1:8, size=100, replace=TRUE) 

df <- data.frame(Gender,State, Number) 
+0

'ライブラリ(dplyr)試してみてください。DF%>%GROUP_BY(性別、州)%>%(番号= CUMSUM(Number)を変異させます) '確かに出力については確かではない – akrun

+0

それは汚れたテーブル名である – vol7ron

+0

" Cumsumテーブル "とは何ですか?私たちは皆、あなたが出力したいものを推測しています。 – thelatemail

答えて

1

我々はCUMSUMテーブルを探しているなら、

library(data.table) 
dcast(setDT(df)[, .N, .(Gender, State, Number) 
     ][, perc := round(100*N/sum(N), 2), .(Gender, State)], 
    Gender + State ~Number, value.var = 'perc', fill = 0, drop = FALSE)[, 
    (3:10) := lapply(Reduce(`+`, .SD, accumulate = TRUE), 
      function(x) paste0(x, "%")), .SDcols = -(1:2)][] 
+1

これはまさに私が探していたものです!私は思ったよりコードが複雑です。あなたの時間と努力に感謝します! – joerna

1

dplyrの使用をお勧めします。あなたがtidyverseを読み込むと、Dplyrは他の有用なパッケージと一緒に読み込まれます。その後、

library(tidyverse) 

Gender = sample(c('male', 'female'), 100, replace=TRUE) 
State = sample(c('CA', 'WA', 'NV', 'OR', "AZ"), 100, replace=TRUE) 
Number = sample(1:8, size=100, replace=TRUE) 

df <- data.frame(Gender,State, Number) 

df <- df %>% 
    group_by(Gender, State) %>% 
    mutate(Number_CumSum = cumsum(Number)) %>% 
    ungroup() %>% 
    arrange(State, Gender) 

head(df) 

# A tibble: 6 x 4 
    Gender State Number Number_CumSum 
    <fctr> <fctr> <int>   <int> 
1 female  AZ  8    8 
2 female  AZ  3   11 
3 female  AZ  4   15 
4 female  AZ  5   20 
5 female  AZ  2   22 
6 female  AZ  7   29