Если столбец A имеет значение, суммируйте переменные в столбце B, пока не появится следующая переменная в столбце A - PullRequest
1 голос
/ 08 ноября 2019

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

Теперь у меня есть столбец (A) с количеством ходов между каждым сохранением и столбцом (B) со временем между каждым ходом до сохранения фигуры. Таким образом, столбец A заполняется символами NA, а затем числом (обозначает цифру в безопасности), а столбец B имеет время в секундах во всех строках (кроме первого ряда), обозначающих все сделанные шаги.

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

A   B           C

NA  1.6667798   
NA  3.3326443   
NA  3.5506110   
NA  11.4995562  
NA  1.4334849   
NA  4.9502637   
NA  2.1161980   
NA  4.7833326   
NA  2.8500842   
NA  4.0331373   
NA  4.3498785   
12  5.0910905   Sum

NA  4.2424078   
NA  1.7332665   
NA  1.5341006   
3   4.8923275   Sum

NA  4.1064621   
NA  3.3498289   
NA  1.6002373   
3   6.0122170   Sum 

Я пробовал несколько вариантов цикла, но я не могу заставить его работать должным образом. Я сделал этот цикл, но он не выполняет правильные вычисления в столбце C.

data$C <- rep(NA, nrow(data))

for (i in unique(data$id)) {
  C <- which(data$id == i & data$type == "moveblock")
  for (e in 1:length(C)){
    if (e == 1){
    data$C[C[e]] = C[e] - which(data$id == i)[1]  
    }
    else if (e > 1){
    data$C[C[e]] = C[e] + C[e+1]+1}
  } 

  d_times <- which(data$id == i)
  for (t in 2:length(d_times)){
    data$B[d_times[t]] <- data$time[d_times[t]] - data$time[d_times[t-1]]
  }
}

Я хочу новый столбец (C), в котором будет сумма всех строк из столбца B, пока фигура не будет сохранена= число в столбце A. Другими словами, я хочу вычислить общее время, которое потребовалось субъекту, чтобы сделать все ходы перед сохранением рисунка.

Надеюсь, что кто-нибудь может понять это!

Ответы [ 2 ]

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

Вы можете создать матрицу из периодов (т.е. seq uences) и соответствующим образом суммировать значения столбца B. Для этого создайте вектор saved, который указывает, где субъект "сохранил", и перечислите последовательности, используя apply(). Наконец, sapply() перебирает последовательности в списке periods.

saved <- which(!is.na(dat$A))
periods <- apply(cbind(c(1, (saved + 1)[-3]), saved), 1, function(x) seq(x[1], x[2]))
dat$C[saved] <- sapply(periods, function(x) sum(dat$B[x]))

Результат

dat$C
# [1]       NA       NA       NA       NA       NA       NA       NA       NA       NA
# [10]       NA       NA 49.65706       NA       NA       NA 12.40210       NA       NA
# [19]       NA 15.06875

Данные

dat <- structure(list(A = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 12L, NA, NA, NA, 3L, NA, NA, NA, 3L), B = c(1.6667798, 3.3326443, 
3.550611, 11.4995562, 1.4334849, 4.9502637, 2.116198, 4.7833326, 
2.8500842, 4.0331373, 4.3498785, 5.0910905, 4.2424078, 1.7332665, 
1.5341006, 4.8923275, 4.1064621, 3.3498289, 1.6002373, 6.012217
), C = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, -20L), class = "data.frame")
0 голосов
/ 08 ноября 2019

Мы можем создать группы на основе вхождения не NA значений и принять sum

library(dplyr)
df %>% 
 group_by(group = lag(cumsum(!is.na(A)), default = 0)) %>% 
 summarise(sum = sum(B, na.rm = TRUE))

#  group   sum
#  <dbl> <dbl>
#1     0  49.7
#2     1  12.4
#3     2  15.1

В базе R мы можем использовать aggregate, чтобы сделать то же самое

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

данные

df <- structure(list(A = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 12L, NA, NA, NA, 3L, NA, NA, NA, 3L), B = c(1.6667798, 3.3326443, 
3.550611, 11.4995562, 1.4334849, 4.9502637, 2.116198, 4.7833326, 
2.8500842, 4.0331373, 4.3498785, 5.0910905, 4.2424078, 1.7332665, 
1.5341006, 4.8923275, 4.1064621, 3.3498289, 1.6002373, 6.012217
)), class = "data.frame", row.names = c(NA, -20L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...