Сумма столбца B (move_time) в зависимости от столбца A (правки) и id - PullRequest
0 голосов
/ 11 ноября 2019

Я провел эксперимент, в котором люди перемещаются по кубам, пока не получат фигуру, которая им нравится. Когда им нравится фигура, они сохраняют и создают новую. Сценарий отслеживает время в секундах и сохраняет количество ходов между всеми цифрами.

Я пробовал следующее:

aggregate(B~c(0, head(cumsum(!is.na(A)), -1)) + id, df, sum, na.rm = TRUE)

Приведенный выше код вычисляет сумму «времени хода», но не удаетсяучитывать изменение в id.

Ожидаемый результат, где C - это вычисленная сумма:

id A B C
p1 NA 2 NA
p1 5 10 19
p1 NA 4 NA
p2 NA NA NA 
p2 NA 2 NA 
p2 2 3 5
p2 NA 1 NA 

В столбце C, строке 6, нам нужно значение 5, но в настоящее время мы получаем 9(из столбца B: 4 + 2 + 3 = 9)

Выдержка из реальных данных:

id            time      A       B
1  pair001  6.937567    NA        NA
2  pair001  8.604347    NA  1.666780
3  pair001 11.936991    NA  3.332644
4  pair001 15.487602    NA  3.550611
5  pair001 26.987158    NA 11.499556
6  pair001 28.420643    NA  1.433485
7  pair001 33.370907    NA  4.950264
8  pair001 35.487105    NA  2.116198
9  pair001 40.270437    NA  4.783333
10 pair001 43.120522    NA  2.850084
11 pair001 47.153659    NA  4.033137
12 pair001 51.503537    NA  4.349879
13 pair001 56.594628    12  5.091090
14 pair001 60.837036    NA  4.242408
15 pair001 62.570302    NA  1.733266
16 pair001 64.104403    NA  1.534101
17 pair001 68.996730     3  4.892327
18 pair001 73.103192    NA  4.106462
19 pair001 76.453021    NA  3.349829
20 pair001 78.053259    NA  1.600237

1 Ответ

0 голосов
/ 11 ноября 2019

Вы можете использовать split для расчета C на id, например:

df <- structure(list(id = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("p1", 
"p2"), class = "factor"), A = c(NA, 5L, NA, NA, NA, 2L, NA), 
    B = c(2L, 10L, 4L, NA, 2L, 3L, 1L)), row.names = c(NA, -7L
), class = "data.frame")

df$C <- unlist(lapply(split(df, paste(df$id, c(0, head(cumsum(!is.na(df$A)), -1))))
    , function(x) {ifelse(is.na(x$A), NA, cumsum(replace(x$B,is.na(x$B),0)))}))
df
#  id  A  B  C
#1 p1 NA  2 NA
#2 p1  5 10 12
#3 p1 NA  4 NA
#4 p2 NA NA NA
#5 p2 NA  2 NA
#6 p2  2  3  5
#7 p2 NA  1 NA

или с реальными данными:

df$C <- unlist(lapply(split(df, paste(df$id, c(0, head(cumsum(!is.na(df$A)), -1))))
    , function(x) {ifelse(is.na(x$A), NA, cumsum(replace(x$B,is.na(x$B),0)))}))
df
#        id      time  A         B        C
#1  pair001  6.937567 NA        NA       NA
#2  pair001  8.604347 NA  1.666780       NA
#3  pair001 11.936991 NA  3.332644       NA
#4  pair001 15.487602 NA  3.550611       NA
#5  pair001 26.987158 NA 11.499556       NA
#6  pair001 28.420643 NA  1.433485       NA
#7  pair001 33.370907 NA  4.950264       NA
#8  pair001 35.487105 NA  2.116198       NA
#9  pair001 40.270437 NA  4.783333       NA
#10 pair001 43.120522 NA  2.850084       NA
#11 pair001 47.153659 NA  4.033137       NA
#12 pair001 51.503537 NA  4.349879       NA
#13 pair001 56.594628 12  5.091090 49.65706
#14 pair001 60.837036 NA  4.242408       NA
#15 pair001 62.570302 NA  1.733266       NA
#16 pair001 64.104403 NA  1.534101       NA
#17 pair001 68.996730  3  4.892327 12.40210
#18 pair001 73.103192 NA  4.106462       NA
#19 pair001 76.453021 NA  3.349829       NA
#20 pair001 78.053259 NA  1.600237       NA

Данные:

df <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "pair001", class = "factor"), 
    time = c(6.937567, 8.604347, 11.936991, 15.487602, 26.987158, 
    28.420643, 33.370907, 35.487105, 40.270437, 43.120522, 47.153659, 
    51.503537, 56.594628, 60.837036, 62.570302, 64.104403, 68.99673, 
    73.103192, 76.453021, 78.053259), A = c(NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, 12L, NA, NA, NA, 3L, NA, NA, 
    NA), B = c(NA, 1.66678, 3.332644, 3.550611, 11.499556, 1.433485, 
    4.950264, 2.116198, 4.783333, 2.850084, 4.033137, 4.349879, 
    5.09109, 4.242408, 1.733266, 1.534101, 4.892327, 4.106462, 
    3.349829, 1.600237)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...