У меня есть df из 300 столбцов с именами N0, N1, N2, N3 ... N300. Все значения являются цифрами c (нет данных). Я хочу вычесть N1-N0 в новый столбец, мы назовем этот столбец х. Затем я хочу вычесть N2-X, чтобы получить новый столбец, который впоследствии будет использоваться как последнее вычитание N3. вот пример
N0 N1 N2 1 2 3 0 1 2 1 1 0
первый шаг: N1-N0 = x
X - 1 1 0
второй шаг: N2-X = Y
Y - 2 1 0
И так далее ... продолжайте делать это для моих 300 столбцов!
Хорошо, заранее спасибо!
Это должно работать:
nc = ncol(df) nc_odd = seq(1, nc, by = 2) nc_even = seq(2, nc, by = 2) result = rowSums(df[, nc_even]) - rowSums(df[, nc_odd]) if(nc %% 2 == 1) result = -result # flip sign if there is an odd number of columns
Объяснение:
N300 - (N299 - (N298 - ... (N2 - (N1 - N0))...)) совпадает с (N300 + N298 + N296 + ... + N2 + N0) - (N299 + N297 + ... + N1). Все четные столбцы заканчиваются одинаковым знаком, а все нечетные столбцы заканчиваются одинаковым знаком. Положительные или отрицательные признаки зависят от общего количества столбцов.
N300 - (N299 - (N298 - ... (N2 - (N1 - N0))...))
(N300 + N298 + N296 + ... + N2 + N0) - (N299 + N297 + ... + N1)
Опция с reduce
reduce
library(purrr) reduce(df, ~ .y - .x) #[1] 2 1 0
df <- structure(list(N0 = c(1L, 0L, 1L), N1 = c(2L, 1L, 1L), N2 = c(3L, 2L, 0L)), class = "data.frame", row.names = c(NA, -3L))
Вот простой вариант, используя Reduce:
Reduce
res <- Reduce(function(x,y) y-x,df)
, такой что
> res [1] 2 1 0
DATA