计算R中缺失值的求和、减法或求和与减法

计算R中缺失值的求和、减法或求和与减法,r,data.table,R,Data.table,我想知道当某些值丢失时,是否有一种优化的求和、减法或两者兼而有之的方法 例如,由于缺失,无法直接进行以下计算 library("data.table") library("benchr") library("glue") dt <- data.table(A = c(NA, 2, 3, 4, NA), B = c( 1, NA, 3, NA, NA),

我想知道当某些值丢失时,是否有一种优化的求和、减法或两者兼而有之的方法

例如,由于缺失,无法直接进行以下计算

library("data.table")
library("benchr")
library("glue")

dt <- data.table(A = c(NA,  2,  3,  4, NA),
                 B = c( 1, NA,  3, NA, NA),
                 C = c( 1,  2, NA, NA, NA))

dt[, SUM := A + B + C]
dt[, DIF := A - B - C]
dt[, MIX := A + B - C]

dt

    A  B  C SUM DIF MIX
1: NA  1  1  NA  NA  NA
2:  2 NA  2  NA  NA  NA
3:  3  3 NA  NA  NA  NA
4:  4 NA NA  NA  NA  NA
5: NA NA NA  NA  NA  NA

库(“data.table”)
图书馆(“长凳”)
图书馆(“胶水”)

dt通过使用
mapply

library(data.table)
dt <- data.table(A = c(1,  2,  3,  4, NA),
                 B = c( 1, NA,  3, NA, NA),
                 C = c( 1,  2, NA, NA, NA))

dt[, SUM := mapply(sum, A,B,C, na.rm =TRUE)]
dt[, DIF := mapply(sum, A,-B,-C, na.rm =TRUE)]
dt[, MIX := mapply(sum, A,B,-C, na.rm =TRUE)]

    A  B  C SUM DIF MIX
1:  1  1  1   3  -1   1
2:  2 NA  2   4   0   0
3:  3  3 NA   6   0   6
4:  4 NA NA   4   4   4
5: NA NA NA   0   0   0
库(data.table)

dt对@Pete Kittinons建议的可能改进,包括行和。我还没有对它进行基准测试,但是这个解决方案更通用,而且可能更快(rowSums的速度非常快)

dt
A B C和DIF混合
1:NA112-20
2:2Na2400
3:-33NA0-60
4:4Na4Na4
5:NA-NA 0 0 0

您可以尝试以下
数据表
选项

dt[, c(.SD, .(
  SUM = rowSums(.SD, na.rm = TRUE),
  DIF = rowSums(mapply("*", .SD, c(1, -1, -1)), na.rm = TRUE),
  MIX = rowSums(mapply("*", .SD, c(1, 1, -1)), na.rm = TRUE)
))]

    A  B  C SUM DIF MIX
1: NA  1  1   2  -2   0
2:  2 NA  2   4   0   0
3:  3  3 NA   6   0   6
4:  4 NA NA   4   4   4
5: NA NA NA   0   0   0

由于性能是一个问题,您可能希望使用矢量化或超快速函数。也许
dt[,SUM:=rowSums(dt,na.rm=TRUE)]
比您原来的
dt[,SUM:=mapply(SUM,A,B,C,na.rm=TRUE)]
更快,例如非常好的建议。我可以问一下如何在DIF和MIX row上实现这一点吗?请看下面我的回答。这是我想要的,这比我的回答有一些显著的改进。我想知道这个“mapply(“*”)%>%rowSums”是否有效,though@GuedesBF我认为你的代码和这个一样高效,从速度的角度来看。你能解释一下为什么
rowSums(mappy(“*”,.SD,c(1,-1,-1)),na.rm=TRUE)
比仅仅使用
mappy(sum,A,-B,-c,na.rm=TRUE)
更快吗。Thanks@PeteKittinun我没有测试速度。我不确定
mappy
是否更快……很好,我认为这将是最快的。由于它(正确地)变形为
数据。表
问题,我将删除
Rcpp
标记。
Rcpp
是否有任何功能允许我们实现相同的结果?
library(data.table)
dt <- data.table(A = c(1,  2,  3,  4, NA),
                 B = c( 1, NA,  3, NA, NA),
                 C = c( 1,  2, NA, NA, NA))

dt[, SUM := mapply(sum, A,B,C, na.rm =TRUE)]
dt[, DIF := mapply(sum, A,-B,-C, na.rm =TRUE)]
dt[, MIX := mapply(sum, A,B,-C, na.rm =TRUE)]

    A  B  C SUM DIF MIX
1:  1  1  1   3  -1   1
2:  2 NA  2   4   0   0
3:  3  3 NA   6   0   6
4:  4 NA NA   4   4   4
5: NA NA NA   0   0   0
dt <- data.table(A = c(NA,  2, -3,  4, NA),
                 B = c( 1, NA,  3, NA, NA),
                 C = c( 1,  2, NA, NA, NA))

dt[, SUM := rowSums(dt, na.rm =TRUE)]
dt[, DIF := rowSums(cbind(dt[,A], dt[,B:C]*-1), na.rm = TRUE)]
dt[, MIX := rowSums(cbind(dt[,A:B], dt[,C]*-1), na.rm=TRUE)]

> dt
    A  B  C SUM DIF MIX
1: NA  1  1   2  -2   0
2:  2 NA  2   4   0   0
3: -3  3 NA   0  -6   0
4:  4 NA NA   4   4   4
5: NA NA NA   0   0   0
dt[, c(.SD, .(
  SUM = rowSums(.SD, na.rm = TRUE),
  DIF = rowSums(mapply("*", .SD, c(1, -1, -1)), na.rm = TRUE),
  MIX = rowSums(mapply("*", .SD, c(1, 1, -1)), na.rm = TRUE)
))]
    A  B  C SUM DIF MIX
1: NA  1  1   2  -2   0
2:  2 NA  2   4   0   0
3:  3  3 NA   6   0   6
4:  4 NA NA   4   4   4
5: NA NA NA   0   0   0