在数据表中查找和子集模式

时间:2018-03-21 17:47:17

标签: r data.table

假设我们有一个缺少值的数据表(参见下面的示例)。

library(data.table)
mat <- matrix(rnorm(50), ncol = 5)
mat[c(1,3,5,9,10,11,14,37,38)] <- NA

DT <- as.data.table(mat)

在我们的示例中,总共有5个唯一的缺失数据模式(请参阅unique(!is.na(DT)))。

现在进一步假设我们想要找到这些模式并根据它们的出现频率来识别它们(从1表示的最频繁模式开始)。

DTna <- as.data.table(!is.na(DT))
DTna <- DTna[, n := .N, by = names(x = DTna)]
DTna <- DTna[, id := 1:nrow(x = DTna)]
DTna <- DTna[order(n, decreasing = TRUE)]
DTna <- DTna[, m := .GRP, by = eval(names(x = DT))]

最后,具有特定模式的观察应根据预先指定(例如,对于最常见的模式为1)进行子集化。

pattern <- 1
i <- DTna[m == pattern, id]
DT[i]

总之,我需要找到共享相同缺失数据模式的观察结果,然后根据预先指定(例如最常见的模式)对它们进行子集化。请注意,我需要将DT分组,而不是DTna

问题

到目前为止,上面的代码按预期工作,但使用data.table是否有更优雅的方式?

2 个答案:

答案 0 :(得分:6)

我会在DT中添加一个分组列来加入和过滤:

DT[, nag := do.call(paste0, lapply(.SD, function(x) +is.na(x)))]
nagDT = DT[, .N, by=nag][order(-N), nagid := .I][, setorder(.SD, nagid)]

#      nag N nagid
# 1: 10000 4     1
# 2: 00000 2     2
# 3: 00010 2     3
# 4: 11000 1     4
# 5: 01000 1     5

# subsetting
my_id = 1L
DT[nagDT[nagid == my_id, nag], on=.(nag), nomatch=0]

给出了

   V1         V2         V3          V4         V5   nag
1: NA  1.3306093 -2.1030978  0.06115726 -0.2527502 10000
2: NA  0.2852518 -0.1894425  0.86698633 -0.2099998 10000
3: NA -0.1325032 -0.5201166 -0.94392417  0.6515976 10000
4: NA  0.3199076 -1.0152518 -1.61417902 -0.6458374 10000

如果要在结果中省略新列:

DT[nagDT[nagid == my_id, nag], on=.(nag), nomatch=0, !"nag"]

并且还省略了空白列:

DT[nagDT[nagid == my_id, nag], on=.(nag), nomatch=0, !"nag"][, 
  Filter(function(x) !anyNA(x), .SD)]

答案 1 :(得分:2)

一种替代方案,无疑是劣等的(但仍然提供多样性),

DT[, patCnt := setDT(stack(transpose(DT)))[,
   paste(+(is.na(values)), collapse=""), by="ind"][,
   patCnt := .N, by=(V1)]$patCnt]

返回

DT
            V1          V2         V3         V4          V5 patCnt
 1:         NA          NA -1.5062011 -0.9846015  0.12153714      1
 2:  1.4176784 -0.08078952 -0.8101335  0.6437340 -0.49474613      2
 3:         NA -0.08410076 -1.1709337 -0.9182901  0.67985806      4
 4:  0.2104999          NA -0.1458075  0.8192693  0.05217464      1
 5:         NA -0.73361504  2.1431392 -1.0041705  0.29198857      4
 6:  0.3841267 -0.75943774  0.6931461 -1.3417511 -1.53291515      2
 7: -0.8011166  0.26857593  1.1249757         NA -0.57850361      2
 8: -1.5518674  0.52004986  1.6505470         NA -0.34061924      2
 9:         NA  0.83135928  0.9155882  0.1856450  0.31346976      4
10:         NA  0.60328545  1.3042894 -0.5835755 -0.17132227      4

然后是子集

DT[patCnt == max(patCnt)]
   V1          V2         V3         V4         V5 patCnt
1: NA -0.08410076 -1.1709337 -0.9182901  0.6798581      4
2: NA -0.73361504  2.1431392 -1.0041705  0.2919886      4
3: NA  0.83135928  0.9155882  0.1856450  0.3134698      4
4: NA  0.60328545  1.3042894 -0.5835755 -0.1713223      4