Вычесть четные столбцы из нечетных в кадре данных - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть фрейм данных (на самом деле у меня 170 столбцов (85 пар) и ~ 8000 строк)

data <- data.frame(A = c(6,5,4,3), B = c(2,2,2,2), C = c(9,8,7,6), D = c(2,2,2,2))

Я хотел бы вычесть столбец 2 из столбца 1, столбец 4 из столбца 3 и т. Д. Для всех строк.

Я думаю, мне нужно либо попытаться написать функцию, либо как-нибудь применить apply.

Ответы [ 5 ]

0 голосов
/ 07 ноября 2018

Просто еще один подход с использованием apply:

-t(apply(data, 1, diff))[ , seq(1, ncol(data)-1, by=2)]

#      B D
# [1,] 4 7
# [2,] 3 6
# [3,] 2 5
# [4,] 1 4
0 голосов
/ 07 ноября 2018

Наличие 170 столбцов, указание каждого имени столбца было бы устрашающе. Если все ваши столбцы являются числовыми, вы можете сделать это:

#Sample data
set.seed(123)
df <- data.frame(x = floor(rnorm(5, 10, 2)),
                 y = floor(rnorm(5, 30, 2)),
                 z = floor(rnorm(5, 50, 2)))
   x  y  z
1  8 33 52
2  9 30 50
3 13 27 50
4 10 28 50
5 10 29 48    

Вычитающие столбцы:

df[-1] - df[-ncol(df)]

  y  z
1 25 19
2 21 20
3 14 23
4 18 22
5 19 19
0 голосов
/ 07 ноября 2018

R имеет векторизованные операции для решения задач такого типа за один вызов:

data[c(1,3)] - data[c(2,4)]
## or for every column until the end of the dataset
data[seq(1,ncol(data),2)] - data[seq(2,ncol(data),2)]
#  A C
#1 4 7
#2 3 6
#3 2 5
#4 1 4

В этом предыдущем обсуждении вы найдете много полезных советов - Выбор нескольких нечетных или четных столбцов / строк для фрейма данных

Вы можете расширить это, чтобы присвоение имен выполнялось автоматически:

s <- seq(1,ncol(data),2)
data[paste0(names(data[s]), "minus", names(data)[-s])] <- data[s] - data[-s]
data

#  A B C D AminusB CminusD
#1 6 2 9 2       4       7
#2 5 2 8 2       3       6
#3 4 2 7 2       2       5
#4 3 2 6 2       1       4
0 голосов
/ 07 ноября 2018

Вы можете выбрать любой другой столбец с помощью c (ИСТИНА, ЛОЖЬ) или его отрицания. У двоичного минуса есть метод данных:

data[c(TRUE,FALSE)] - data[c(FALSE,TRUE)]
  A C
1 4 7
2 3 6
3 2 5
4 1 4

Если вы хотите назвать имя, тогда вы можете использовать paste в именах:

 paste( names(data[c(TRUE,FALSE)]) , "_minus_", names( data[c(FALSE,TRUE)]) )
0 голосов
/ 07 ноября 2018

Многие базовые операции над data.frame векторизованы, что означает, что сложение, вычитание, умножение и т. Д. Являются поэлементными. То есть следующие работы:

data <- data.frame(A = c(6,5,4,3), B = c(2,2,2,2), C = c(9,8,7,6), D = c(2,2,2,2))

data$AminusB <- data$A - data$B
data$CminusD <- data$C - data$D

print(data)
#  A B C D AminusB CminusD
#1 6 2 9 2       4       7
#2 5 2 8 2       3       6
#3 4 2 7 2       2       5
#4 3 2 6 2       1       4

Вы также можете получить доступ к столбцу 4. скажем, по data[4] или data[,4] или data[,"D"] и более. Смотри help("["). В зависимости от того, как вы хотите, чтобы ваш вывод, есть много вариантов, как это сделать. С помощью простого цикла for вы можете перебирать столбцы и делать все различия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...