Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用数值减去行并忽略NAs_R_Data.table_Rows_Na_Subtraction - Fatal编程技术网

R 用数值减去行并忽略NAs

R 用数值减去行并忽略NAs,r,data.table,rows,na,subtraction,R,Data.table,Rows,Na,Subtraction,我有几个数据框,包含18列,约50000行。每行条目表示特定站点(=列)的测量值,数据包含NA值 我需要减去每列的连续行(例如,行(I+1)-行(I))以检测阈值,但我需要忽略(并保留)NAs,以便只有具有数值的条目相互减去 我发现了一些非常有用的帖子,其中包含了data.table单列和多列操作(例如)的解决方案 但是,我还没有将SO中建议的方法结合起来(即在多个列上应用diff,忽略NAs) 下面是一个示例df,用于说明和我尝试的解决方案: library(data.table) df &

我有几个数据框,包含18列,约50000行。每行条目表示特定站点(=列)的测量值,数据包含NA值

我需要减去每列的连续行(例如,行(I+1)-行(I))以检测阈值,但我需要忽略(并保留)NAs,以便只有具有数值的条目相互减去

我发现了一些非常有用的帖子,其中包含了
data.table
单列和多列操作(例如)的解决方案

但是,我还没有将SO中建议的方法结合起来(即在多个列上应用
diff
,忽略NAs)

下面是一个示例df,用于说明和我尝试的解决方案:

library(data.table)

df <- data.frame(x=c(1:3,NA,NA,9:7),y=c(NA,4:6, NA,15:13), z=c(6,2,7,14,20, NA, NA, 2))

对于如何实施有效的
base
data.table
dplyr
,…解决方案,如有任何建议,我将不胜感激!将.na
或类似语句插入到第二行代码中

那么您正在寻找:

library("data.table")

df <- data.frame(x=c(1:3,NA,NA,9:7),y=c(NA,4:6, NA,15:13), z=c(6,2,7,14,20, NA, NA, 2))
setDT(df)
# diff_x <- df[!is.na(x), lag_diff := x - shift(x)]  # actually what I want, but

lag_d <- function(x) { y <- x[!is.na(x)]; x[!is.na(x)] <- y - shift(y); x }
df[, lapply(.SD, lag_d)]
库(“data.table”)

df定义一个helper函数可以让事情变得更清晰:

 lag_diff <- function(x) {
   which_nna <- which(!is.na(x))
   out <- rep(NA_integer_, length(x))
   out[which_nna] <- x[which_nna] - shift(x[which_nna])
   out
 }

cols <- c("x", "y", "z")
setDT(df)
df[, paste0("lag_diff_", cols) := lapply(.SD, lag_diff), .SDcols = cols]

非常感谢你们两位,jogo和@sindri_baldur,感谢你们对我的问题的快速回复和非常有用的解决方案!
library("data.table")

df <- data.frame(x=c(1:3,NA,NA,9:7),y=c(NA,4:6, NA,15:13), z=c(6,2,7,14,20, NA, NA, 2))
setDT(df)
# diff_x <- df[!is.na(x), lag_diff := x - shift(x)]  # actually what I want, but

lag_d <- function(x) { y <- x[!is.na(x)]; x[!is.na(x)] <- y - shift(y); x }
df[, lapply(.SD, lag_d)]
library("data.table")

df <- data.frame(x=c(1:3,NA,NA,9:7),y=c(NA,4:6, NA,15:13), z=c(6,2,7,14,20, NA, NA, 2))
lag_d <- function(x) { y <- x[!is.na(x)]; x[!is.na(x)] <- y - shift(y); x }
as.data.frame(lapply(df, lag_d))
 lag_diff <- function(x) {
   which_nna <- which(!is.na(x))
   out <- rep(NA_integer_, length(x))
   out[which_nna] <- x[which_nna] - shift(x[which_nna])
   out
 }

cols <- c("x", "y", "z")
setDT(df)
df[, paste0("lag_diff_", cols) := lapply(.SD, lag_diff), .SDcols = cols]
#     x  y  z lag_diff_x lag_diff_y lag_diff_z
# 1:  1 NA  6         NA         NA         NA
# 2:  2  4  2          1         NA         -4
# 3:  3  5  7          1          1          5
# 4: NA  6 14         NA          1          7
# 5: NA NA 20         NA         NA          6
# 6:  9 15 NA          6          9         NA
# 7:  8 14 NA         -1         -1         NA
# 8:  7 13  2         -1         -1        -18