Я хочу добавить увеличивающиеся последовательные столбцы данных - PullRequest
3 голосов
/ 23 апреля 2020

У меня есть датафрейм с 20 столбцами. Я хочу сначала вычислить сумму первых двух столбцов, затем следующие три столбца и продолжать добавлять, пока у меня не будет суммы всех 20 столбцов. DataFrame имеет только 0 и 1. Если сумма k столбцов превышает пять, я хочу изменить значения оставшихся столбцов на 0. Я не могу создать al oop, чтобы сделать то же самое

0 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0
0 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0
1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 1
0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0
0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0

Например, в первом ряду, поскольку мы достигли сумма = 5 в 9-м столбце, я хочу изменить оставшиеся значения на 0 ie третье последнее значение на 0.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

РЕДАКТИРОВАТЬ: решение Base R

df <- as.data.frame(dt)


tdf <- data.frame(t(df))

tdf$X1[cumsum(tdf$X1)>5] <- 0
tdf$X2[cumsum(tdf$X2)>5] <- 0
tdf$X3[cumsum(tdf$X3)>5] <- 0
tdf$X4[cumsum(tdf$X4)>5] <- 0
tdf$X5[cumsum(tdf$X5)>5] <- 0


t(tdf)
#>    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16
#> X1  0  0  0  1  1  0  1  1  1   0   0   0   0   0   0   0
#> X2  0  1  1  0  0  0  0  0  1   1   0   0   0   0   1   0
#> X3  1  0  1  0  0  0  1  1  1   0   0   0   0   0   0   0
#> X4  0  1  1  0  0  0  0  0  0   0   0   0   0   1   1   0
#> X5  0  1  0  1  0  1  0  0  0   0   0   0   0   1   1   0

Вы можете t() сначала ваш фрейм данных.

И использовать функцию cumsum и t результат назад

library(data.table)

dt <- fread('0 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0
0 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0
1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 1
0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0
0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0')

tdt <- data.table(t(dt))

tdt[,names(tdt):=lapply(.SD,function(x) {x[cumsum(x)>5] <- 0
                                         x})]

t(tdt)
#>    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
#> V1    0    0    0    1    1    0    1    1    1     0     0     0     0     0
#> V2    0    1    1    0    0    0    0    0    1     1     0     0     0     0
#> V3    1    0    1    0    0    0    1    1    1     0     0     0     0     0
#> V4    0    1    1    0    0    0    0    0    0     0     0     0     0     1
#> V5    0    1    0    1    0    1    0    0    0     0     0     0     0     1
#>    [,15] [,16]
#> V1     0     0
#> V2     1     0
#> V3     0     0
#> V4     1     0
#> V5     1     0

Создано в 2020-04-23 пакетом Представить (v0.3.0)

1 голос
/ 23 апреля 2020

Вот вариант с dplyr

library(dplyr)
df1 %>%
   t %>% 
   as_tibble %>%
   mutate_all(~ replace(., cumsum(.) > 5, 0)) %>% 
   t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...