Вычитание строки 2 из строки 1 в столбик

У меня есть объект Tibble в R, который выглядит следующим образом:

Для каждого столбца я хочу вычесть row1 из row2. Мой текущий подход ниже:

mean.diff <- each.group.mean[1,2:num.groups]-each.group.mean[2,2:num.centroids]

Что сбивает с толку, так это то, что для выполнения этого оператора в тибле 2x9660 коду требуется 8-15 секунд, что определяется вычислением Sys.time(). Был бы признателен за любую помощь, чтобы сделать это быстрее и понять, почему эта команда занимает так много времени.

1 ответ

Решение

От unlistОднако, мы могли бы преобразовать это в vector и сделать его более эффективным

unlist(each.group.mean[1,2:num.groups], use.names = FALSE)-
    unlist(each.group.mean[2,2:num.centroids], use.names = FALSE)

Причина в том, что data.frame или же tibble и т.д. имеют много атрибутов класса, что замедляет выполнение подмножества, а затем вычисление. Преобразовав в vector все эти классы сняты. Используя воспроизводимый пример

данные

set.seed(24)
df1 <- as.tibble(as.data.frame(matrix(sample(1:10, 9660*10, 
     replace = TRUE), ncol = 9660)))

Ориентиры

system.time(df1[1,] - df1[2,])
#   user  system elapsed 
#   0.78    0.00    0.78 

system.time(unlist(df1[1,], use.names = FALSE) - unlist(df1[2,], use.names = FALSE))
#   user  system elapsed 
#   0.03    0.00    0.03 
Другие вопросы по тегам