Вычесть один столбец из предыдущего столбца
Пример данных
dfData <- data.frame(ID = c(1, 2, 3, 4, 5),
DistA = c(10, 8, 15, 22, 15),
DistB = c(15, 35, 40, 33, 20),
DistC = c(20,40,50,45,30),
DistD = c(60,55,55,48,50))
ID DistA DistB DistC DistD
1 1 10 15 20 60
2 2 8 35 40 55
3 3 15 40 50 55
4 4 22 33 45 48
5 5 15 20 30 50
У меня есть несколько идентификаторов, для которых есть четыре столбца, которые измеряют совокупное расстояние. Я хочу создать новый столбец, который дает фактическое расстояние для каждого столбца, т.е. вычесть следующий столбец из предыдущего столбца. Например, таблица должна выглядеть так:
ID DistA DistB DistC DistD
1 1 10 5 5 40
2 2 8 27 5 15
3 3 15 25 10 5
4 4 22 11 12 3
5 5 15 5 10 20
Более длинный способ сделать это
dfData$disA <- dfData$DistA
dfData$disB <- dfData$DistB - dfData$DistA
dfData$disC <- dfData$DistC - dfData$DistB
dfData$disD <- dfData$DistD - dfData$DistC
Есть ли более короткий способ сделать это что-то вроде:
apply(dfData,1,function(x) ???)
3 ответа
Решение
Да, ты хочешь diff
...
dfData[,-c(1:2)] <- t(apply(dfData[,-1], 1, diff))
dfData
ID DistA DistB DistC DistD
1 1 10 5 5 40
2 2 8 27 5 15
3 3 15 25 10 5
4 4 22 11 12 3
5 5 15 5 10 20
Мы можем использовать векторизованный вариант
dfData[3:5] <- dfData[-(1:2)] - dfData[-c(1, 5)]
dfData
# ID DistA DistB DistC DistD
#1 1 10 5 5 40
#2 2 8 27 5 15
#3 3 15 25 10 5
#4 4 22 11 12 3
#5 5 15 5 10 20
Если обновленные значения используются для последовательного расчета, то for
петля будет полезна
nm1 <- names(dfData)[-1]
for(i in 1:3) dfData[[nm1[i+1]]] <- dfData[[nm1[i+1]]] - dfData[[nm1[i]]]
Простой способ может быть следующим:
dfData[3:5] = dfData[3:5] - dfData[(3:5) - 1]
# ID DistA DistB DistC DistD
# 1 1 10 5 5 40
# 2 2 8 27 5 15
# 3 3 15 25 10 5
# 4 4 22 11 12 3
# 5 5 15 5 10 20
Очень похоже на один вариант, предоставляемый @akrun.