gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:28:24 25 4
gpt4 key购买 nike

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

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 的更优雅的方式?

最佳答案

我会向 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)]

关于r - 在数据表中查找和子集模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49413319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com