Как накапливать сумму по строке на столбец в R - PullRequest
0 голосов
/ 19 ноября 2018

Я хотел бы сделать строку (накапливать) для столбца в той же строке. Вот что мне нравится:

test = data.frame(c(0,1,1,1,0,0),c(0,0,1,1,1,0),c(0,0,0,1,1,1),c(0,0,0,0,1,1),c(0,0,0,0,0,1))
colnames(test) = c('Position','Position1','Position2','Position3','Position4')
> test
  Position Position1 Position2 Position3 Position4
1        0         0         0         0         0
2        1         0         0         0         0
3        1         1         0         0         0
4        1         1         1         0         0
5        0         1         1         1         0
6        0         0         1         1         1

result = data.frame(c(0,1,2,3,0,0),c(0,0,1,2,3,0),c(0,0,0,1,2,3),c(0,0,0,0,1,2),c(0,0,0,0,0,1))
colnames(result) = c('Position','Position1','Position2','Position3','Position4')
> result
  Position Position1 Position2 Position3 Position4
1        0         0         0         0         0
2        1         0         0         0         0
3        2         1         0         0         0
4        3         2         1         0         0
5        0         3         2         1         0
6        0         0         3         2         1

Результат data.frame - это то, что я хочу.

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Как альтернатива @ duckmayr

apply(test, 2, function(x) {x[x] <- 1:sum(x); x})

#     Position Position1 Position2 Position3 Position4
#[1,]        0         0         0         0         0
#[2,]        1         0         0         0         0
#[3,]        2         1         0         0         0
#[4,]        3         2         1         0         0
#[5,]        0         3         2         1         0
#[6,]        0         0         3         2         1

подробнее:

{        
x[x] <-  # this is a special case because you want to replace the ones. 1 = TRUE in R internally. So you assign values where x == 1. More general would be to write x[x == 1]
1:sum(x) # 1:N makes a sequence from 1, 2, 3, ..., N. sum(x) will return the amount of ones in a col. Again, more general would be `sum(x == 1)`.
; x      # This part is similar to return(x), We want to return the changes we made in x.
}
0 голосов
/ 19 ноября 2018

Сначала я подумал, что вам просто нужно применить cumsum() к каждому столбцу, но, похоже, вам также нужно умножить совокупную сумму на сами столбцы, чтобы обеспечить сохранение нулей:

test = data.frame(c(0,1,1,1,0,0),c(0,0,1,1,1,0),c(0,0,0,1,1,1),c(0,0,0,0,1,1),c(0,0,0,0,0,1))
colnames(test) = c('Position','Position1','Position2','Position3','Position4')
apply(test, 2, function(x) x * cumsum(x))
#>      Position Position1 Position2 Position3 Position4
#> [1,]        0         0         0         0         0
#> [2,]        1         0         0         0         0
#> [3,]        2         1         0         0         0
#> [4,]        3         2         1         0         0
#> [5,]        0         3         2         1         0
#> [6,]        0         0         3         2         1

Создано 2018-11-19 с помощью пакета представительства (v0.2.1)

Если вы действительно хотите просто накопительную сумму для каждого столбца, вы можете просто использовать apply(df, 2, cumsum):

test = data.frame(c(0,1,1,1,0,0),c(0,0,1,1,1,0),c(0,0,0,1,1,1),c(0,0,0,0,1,1),c(0,0,0,0,0,1))
colnames(test) = c('Position','Position1','Position2','Position3','Position4')
apply(test, 2, cumsum)
#>      Position Position1 Position2 Position3 Position4
#> [1,]        0         0         0         0         0
#> [2,]        1         0         0         0         0
#> [3,]        2         1         0         0         0
#> [4,]        3         2         1         0         0
#> [5,]        3         3         2         1         0
#> [6,]        3         3         3         2         1

Создан 2018-11-19 с помощью представительного пакета (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...