[英]R - Cumulative sum of absolute differences based on other column and row
我的數據具有以下格式:
請參閱下面的數據集:
structure(c("", "", "running", "running", "running", "running",
"running", "running", "running", "", "504", "678", "268", "475",
"675", "796", "745", "693", "665", "488"), .Dim = c(10L, 2L), .Dimnames = list(
NULL, c("e", "f")))
我想添加第三列,以給出機器已經運行的總距離(通過添加自機器開始運行以來的所有絕對差值)。 請參閱以下所需的輸出:
e f Output
[1,] "" "504" ""
[2,] "" "678" ""
[3,] "running" "268" "0"
[4,] "running" "475" "207"
[5,] "running" "675" "407"
[6,] "running" "796" "528"
[7,] "running" "745" "579"
[8,] "running" "693" "631"
[9,] "running" "665" "659"
[10,] "" "488" ""
我試圖用R編寫一些代碼來以一種優雅的方式來獲得它,但是目前我的編程技能太有限了。 有誰知道解決這個問題的方法嗎? 預先謝謝您!
其實我不得不承認我沒有完全理解你的問題。
你的意思是這樣嗎?
a <- c("", "", "running", "running", "running", "running",
"running", "running", "running", "", "504", "678", "268", "475",
"675", "796", "745", "693", "665", "488")
a <- data.frame(matrix(a, ncol=2), stringsAsFactors=FALSE)
a[,2] <- as.numeric(a[,2])
subs.a <- subset(a, X1=='running')
abs(diff(subs.a$X2))
cumsum(diff(subs.a$X2))
這回來
abs(diff(subs.a$X2))
[1] 207 200 121 51 52 28
cumsum(abs(diff(subs.a$X2)))
[1] 207 407 528 579 631 659
將其插入到data.frame
:
a[a$X1=='running', 'CumSum'] <- c(0,cumsum(abs(diff(subs.a$X2))))
這為您提供了所需的數據幀:
df <- data.frame(structure(c("", "", "running", "running", "running", "running",
"running", "running", "running", "", "504", "678", "268", "475",
"675", "796", "745", "693", "665", "488"), .Dim = c(10L, 2L), .Dimnames = list(
NULL, c("e", "f"))), stringsAsFactors = F)
runs <- df$e == "running"
df$f <- as.numeric(df$f)
diff <- abs(diff(df$f[runs]))
df$Output[runs] <- 0
df$Output[runs][-1] <- cumsum(diff)
你得到:
e f Output
1 504 NA
2 678 NA
3 running 268 0
4 running 475 207
5 running 675 407
6 running 796 528
7 running 745 579
8 running 693 631
9 running 665 659
10 488 NA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.