1
一個新手
我試圖計算列之間的偏差,並期望應用幾個規則:
- 差由電流值減去計算前值
- 如果當前值是NA,則返回NA不計算
- 如果以前的值是NA,則電流值減去前值前值,直至減有效值
- 在第一列中的值始終是有效
例如:
start = c(1, 2, 3, 4)
a = c(2, NA, 5, 6)
b = c(4, 5, NA, 8)
test <- data.frame(start, a, b)
test
start a b
1 1 2 4
2 2 NA 5
3 3 5 NA
4 4 6 8
預期:
result
a_delta b_delta
1 1 2
2 NA 3
3 2 NA
4 2 2
注:
- 細胞(2,1)結果是NA,因爲在測試中的單元(2,2)是NA
- 細胞(2,2)中的結果是3,因爲單元(2,3)減去細胞(2,1)的結果得到3
這是我的斷碼。任何建議都歡迎:
f <- function(data){
cn <- colnames(data)
cl <- ncol(data)
for (i in 2:cl)){
if (is.na(data$i)) {a <- NA}
else if (!is.na(data$(i-1))) {paste(cn[i], "_delta") <- data$cn[i] - data$cn[i-1]}
else { # check if previous value is NA repeatively
t < i - 1
while (is.na(data$cn[t])) {
t <- t - 1
}
paste(cn[i], "_delta") <- data$cn[i] - data$cn[t]
}
}
}
f(test)
謝謝@Andrey Kolyadin,效果很好。一個側面的問題,在dplyr中是否有類似plyr :: adply的函數? – wctjerry