计算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