mutate_at горизонтальный против вертикального

создать массив int и список

from array import array
listA = list(range(0,50))
for item in listA:
    print(item)
arrayA = array("i", listA)
for item in arrayA:
    print(item)
1
задан Marco De Virgilis 15 January 2019 в 14:44
поделиться

3 ответа

Я не уверен, что есть способ сделать это без использования gather и spread. Вот как бы я это сделал. Сначала я изменил бы данные на «длинные», затем нам нужно использовать group_by, чтобы мы вычисляли только cumsum для каждой строки в исходном data.frame (если это недостаточно сгруппировано, мы можем добавить row_number к данным и group_by, что). После этого мы mutate, а затем spread вернули данные в «широкий». Наконец, мы добавляем select(names(df)), как предлагает @Gregor, чтобы сохранить исходный порядок столбцов.

df %>%
    gather(variable, value, contains('R_')) %>% # reshape wide to long
    group_by(LoB, AY) %>% # group by for each row in original data
    mutate(value = cumsum(value)) %>% # calculate cumsum
    spread(variable, value) %>% # reshape back from long to wide
    select(names(df)) # added to retain original column order

#   LoB      AY   R_0    R_1    R_2    R_3 ...
#   <fct> <dbl> <dbl>  <dbl>  <dbl>  <dbl> ... 
# 1 1      1994 50135 126766 155529 155529 ...
# 2 1      1995 46530  51438  54072  55481 ...
# 3 1      1996 38295  68722  69096  69566 ... 
# 4 1      1997 12033  16301  16301  16301 ...
0
ответ дан bouncyball 15 January 2019 в 14:44
поделиться

Операции со строками часто работают лучше на матрицах. Чтобы избежать хлопот gather/spread, я бы извлек столбцы R_, использовал apply (неявно преобразуя в матрицу) и затем присвоил результат обратно исходным данным:

При этом данные не кажутся очень аккуратными. Возможно, вам лучше gather использовать длинный формат и сохранять его длинным.

result = dd %>% ungroup %>%
  select(starts_with("R_")) %>%
  apply(1, cumsum) %>% 
  t

dd[, grepl("^R_", names(dd))] = result

dd
# # A tibble: 12 x 14
# # Groups:   LoB [1]
#    LoB      AY   R_0    R_1    R_2    R_3    R_4    R_5    R_6    R_7    R_8    R_9   R_10   R_11
#    <fct> <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
#  1 1      1994 50135 126766 155529 155529 171962 178263 178263 178263 178263 178263 178263 178263
#  2 1      1995 46530  51438  54072  55481  55481  55481  55481  55481  55481  55481  55481  55481
#  3 1      1996 38295  68722  69096  69566  70002  70002  70002  70002  70002  70002  70002  70002
#  4 1      1997 12033  16301  16301  16301  16301  16301  16301  16301  16301  16301  16301  16301
#  5 1      1998 13332  15326  15542  15745  15947  16126  16273  16408  16408  16408  16408  16408
#  6 1      1999 35064  83490  83490  83490  85605  85605  85605  85605  85605  85605  85605  85605
#  7 1      2000 15695  20280  20835  20835  20835  20835  20835  20835  20835  20835  20835  20835
#  8 1      2001 41227  56805  56805  56805  56805  56805  56805  56805  56805  56805  56805  56805
#  9 1      2002 88360  96472 103633 103633 103633 103816 103816 103816 103816 103816 103816 103816
# 10 1      2003 29500  60445  62637  64193  65464  66516  67498  68405  69307  70140  70940  71624
# 11 1      2004 30158  38299  38299  38299  38299  38299  38299  40655  40655  40655  40655  40655
# 12 1      2005 47589  59183  59955  60630  61165  61165  61165  61165  61165  61165  61165  61165
0
ответ дан Gregor 15 January 2019 в 14:44
поделиться

Аналогичен ответу на bouncyball, но он сохраняет порядок столбцов и использует универсальный идентификатор в случае, если (LoB, AY) не является первичным ключом:

df %>% 
  mutate(id = 1:n()) %>% 
  gather(old_name, value, starts_with("R_")) %>% 
  arrange(id, nchar(old_name), old_name) %>% 
  group_by(id) %>% 
  mutate(value = cumsum(value)) %>% 
  ungroup() %>% 
  select(-id) %>% 
  spread(old_name, value) %>% 
  select(names(df)) %>% 
  select(AY, everything())
0
ответ дан AEF 15 January 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: