R Разница с предыдущим столбцом в нескольких столбцах - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть такой фрейм данных, полученный в результате совокупности переменных:

id v1  v2   v3
1  4   5    9   
2  1   1    4

Я хотел бы получить разницу между столбцами, например, если фрейм данных преобразуется в:

id v1  v2   v3
1  4   1    4   
2  1   0    3

Таким образом, эффективно «деаккумулируя» полученные значения, получаю разницу.Это небольшой пример исходного df составляет около 150 столбцов.

Thx!

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Простой цикл может помочь, но для больших данных он будет медленнее, чем другие подходы.

df <- data.frame(id = c(1,2), v1 = c(4,1), v2 = c(5,1))
df2 <- df
for(i in 3:ncol(df)){
  df2[,i] <- df[,i] - df[,i-1]
}
0 голосов
/ 18 февраля 2019
x <- read.table(header=TRUE, text="
id v1  v2   v3
1  4   5    9   
2  1   1    4")

x[,c("v1","v2","v3")] <- cbind(x[,"v1"], t(apply(x[,c("v1","v2","v3")], 1, diff)))
x
#   id v1 v2 v3
# 1  1  4  1  4
# 2  2  1  0  3

Объяснение:

  • В начале, примечание: при использовании apply для data.frame он преобразует аргумент в matrix.Это означает, что если в аргументе, переданном apply, есть столбцы character, тогда вся матрица будет character, что, вероятно, не то, что вам нужно.Из-за этого безопаснее выбрать только нужные вам столбцы (и переназначить их специально).

  • apply(.., MARGIN=1, ...) возвращает выходные данные в ориентации, транспонированной с того, что вы могли ожидать, поэтому янужно обернуть его в t(...).

  • Я использую diff, который возвращает вектор длины на одну короче, чем вход, поэтому я cbindисходный столбец с возвратом от t(apply(...)).

  • Так же, как я должен был указать, какие столбцы передавать в apply, я точно так же определен в отношении того, какие столбцы будут заменены навозвращаемое значение.

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