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)
Я не уверен, что есть способ сделать это без использования 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 ...
Операции со строками часто работают лучше на матрицах. Чтобы избежать хлопот 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
Аналогичен ответу на 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())