【问题标题】:nansum in R for data.tableR中的nansum用于data.table
【发布时间】:2016-12-07 21:11:48
【问题描述】:

让我们从 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

我们也有DT2

DT2 <- data.table(c(NA, NA, NA, NA, NA),
                  c(2, 2, 2, 2, 2),
                  c(2, 2, 2, 2, 2))
# 1: NA  2  2
# 2: NA  2  2
# 3: NA  2  2
# 4: NA  2  2
# 5: NA  2  2

我想对两个data.table求和,所以我会得到以下结果:

# 1: NA  3  3
# 2: NA  3  3
# 3: NA  3  3
# 4: NA  3  3
# 5: NA  2  2

【问题讨论】:

  • 您确定要将此数据存储为 data.table/data.frame 而不是矩阵吗?
  • 我使用 data.table 是因为我之前必须做一些繁重的操作,但我不介意在这部分使用矩阵。
  • 为什么繁重操作的结果没有产生0而不是NA
  • 在我的上下文中,0NA 必须不同,但是当我将它们结合起来时,我必须使用上面的总和
  • 还有一件不幸的事:sum(rep(NA, 4), na.rm = TRUE)0。如果不对您的数据进行更多的稳健性检查,我不知道我们如何才能绕过这种融合。

标签: r data.table nan


【解决方案1】:

一个选项是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

【讨论】:

  • 不错。 is.na(x) &amp; is.na(y) 是我用来修复 sum(NA, na.rm = TRUE) == 0 的那种“胶带”……但不要认为我们真的能解决这个问题。
  • 类似于cbindrowSums,可以是rbindrowsum(...这些函数名不是很好...):DT = rbind(DT1[, r := .I], DT2[, r := .I])[, rowsum(as.matrix(.SD), r, na.rm = TRUE)]。但是,这会返回一个矩阵(这可能是 OP 无论如何都应该使用的)。
猜你喜欢
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 2023-03-22
相关资源
最近更新 更多