Вычитание нескольких столбцов в R - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть 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 столбцов!

Хорошо, заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 09 апреля 2020

Это должно работать:

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). Все четные столбцы заканчиваются одинаковым знаком, а все нечетные столбцы заканчиваются одинаковым знаком. Положительные или отрицательные признаки зависят от общего количества столбцов.

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

Опция с reduce

library(purrr)
reduce(df, ~ .y - .x)
#[1] 2 1 0

data

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))
2 голосов
/ 10 апреля 2020

Вот простой вариант, используя Reduce:

res <- Reduce(function(x,y) y-x,df)

, такой что

> res
[1] 2 1 0

DATA

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))
...