R中的nansum用于数据表
让我们从DT1开始R中的nansum用于数据表,r,data.table,nan,R,Data.table,Nan,让我们从DT1开始 library(data.table) DT1 <- data.table(c(NA, NA, NA, NA, NA), c(1, 1, 1, 1, NA), c(1, 1, 1, 1, NA)) # 1: NA 1 1 # 2: NA 1 1 # 3: NA 1 1 # 4: NA 1 1 # 5: NA NA NA 一个选项是Map setDT(Map(function(x,y
library(data.table)
DT1 <- data.table(c(NA, NA, NA, NA, NA),
c(1, 1, 1, 1, NA),
c(1, 1, 1, 1, NA))
# 1: NA 1 1
# 2: NA 1 1
# 3: NA 1 1
# 4: NA 1 1
# 5: NA NA NA
一个选项是
Map
setDT(Map(function(x,y) {x1 <- rowSums(cbind(x,y), na.rm = TRUE)
x1[is.na(x) & is.na(y)] <- NA
x1}, DT1, DT2))[]
# V1 V2 V3
#1: NA 3 3
#2: NA 3 3
#3: NA 3 3
#4: NA 3 3
#5: NA 2 2
setDT(映射(函数x,y){x1您确定要将此数据存储为数据.table
/数据.frame
而不是矩阵吗?我使用data.table是因为我以前必须做一些繁重的操作,但我不介意对该部分使用矩阵。为什么繁重操作的结果不会产生0
而不是NA
?在我的上下文中,0
和NA
必须是不同的,但是当我组合它们时,我必须使用上面的总和还有一件更不幸的事:sum(rep(NA,4),NA.rm=TRUE)
是0
。我不知道我们如何在没有对数据进行更多健壮性检查的情况下绕过这个汇合点。很好。是.NA(x)&is.NA(y)
是我用来固定sum(NA,NA.rm=TRUE)==0
的同一种“管道胶带”…但我们不认为我们真的可以绕过它。与cbind
和rowSums
类似,我们可以rbind
和rowsum
(…这些函数名不太好…)DT=rbind(DT1[,r:=.I],DT2[,r:=.I])[,rowsum(as.matrix(.SD),r,na.rm=TRUE)]
。但是,这会返回一个矩阵(这可能是OP应该使用的矩阵)。
# 1: NA 3 3
# 2: NA 3 3
# 3: NA 3 3
# 4: NA 3 3
# 5: NA 2 2
setDT(Map(function(x,y) {x1 <- rowSums(cbind(x,y), na.rm = TRUE)
x1[is.na(x) & is.na(y)] <- NA
x1}, DT1, DT2))[]
# V1 V2 V3
#1: NA 3 3
#2: NA 3 3
#3: NA 3 3
#4: NA 3 3
#5: NA 2 2