根据预测矩阵自动对数据框进行子集

时间:2018-12-08 17:32:36

标签: r matrix subset r-mice

我为大型数据集创建了一个预测矩阵,如下所示:

library(mice)
dfpredm <- quickpred(df, mincor=.3)

    A   B   C   D   E   F   G   H   I   J
A   0   1   1   1   0   1   0   1   1   0
B   1   0   0   0   1   0   1   0   0   1
C   0   0   0   1   1   0   0   0   0   0
D   1   0   1   0   0   1   0   1   0   1
E   0   1   0   1   0   1   1   0   1   0
**F 0   0   1   0   0   0   1   0   0   0**
G   0   1   0   1   0   0   0   0   0   0
H   1   0   1   0   0   1   0   0   0   1
I   0   1   0   1   1   0   1   0   0   0
J   1   0   1   0   0   1   0   1   0   0

我想基于dfpredm创建原始df的子集。

更具体地说,我想执行以下操作:

让我们假设我的因变量是F。 根据预测矩阵F与C和G相关。 此外,C,G最好分别由D,E和B,D预测。

现在的想法是基于因变量F创建df的子集,该变量在F行中的值为1。

Fpredictors <- df[,(dfpredm["F",]) == 1]

但是对于F中的行为1的变量也要这样做。我正在考虑首先获取像这样的列名:

Fpredcol <-colnames(dfpredm[,(dfpredm["c241",]) == 1])

然后使用这些列名进行for loop吗?

对于特定示例,我想以子集结尾。

dfsub <- df[,c("F","C","G","B","E","D")]

但是我想使这个过程自动化。谁能告诉我该怎么做?

1 个答案:

答案 0 :(得分:2)

这是一种似乎对您有效的策略:

first_preds <- function(dat, predictor) {
  cols <- which(dat[predictor, ] == 1)
  names(dat)[cols]
}

# wrap first_preds() for getting best and second best predictors
first_and_second_preds <- function(dat, predictor) {
  matches <- first_preds(dat, predictor)
  matches <- c(matches, unlist(lapply(matches, function(x) first_preds(dat, x))))
  c(predictor, matches) %>% unique()
}

dat[first_and_second_preds(dat, "F")] # order is not exactly the same as your output

  F C G D E B
A 1 1 0 1 0 1
B 0 0 1 0 1 0
C 0 0 0 1 1 0
D 1 1 0 0 0 0
E 1 0 1 1 0 1
F 0 1 1 0 0 0
G 0 0 0 1 0 1
H 1 1 0 0 0 0
I 0 0 1 1 1 1
J 1 1 0 0 0 0

不确定结果中的顺序是否重要,但是可以添加逻辑。

从此处使用dat(一种在SO上共享小R数据的更友好的方式):

dat <- read.table(
  text = "A   B   C   D   E   F   G   H   I   J
  A   0   1   1   1   0   1   0   1   1   0
  B   1   0   0   0   1   0   1   0   0   1
  C   0   0   0   1   1   0   0   0   0   0
  D   1   0   1   0   0   1   0   1   0   1
  E   0   1   0   1   0   1   1   0   1   0
  F   0   0   1   0   0   0   1   0   0   0
  G   0   1   0   1   0   0   0   0   0   0
  H   1   0   1   0   0   1   0   0   0   1
  I   0   1   0   1   1   0   1   0   0   0
  J   1   0   1   0   0   1   0   1   0   0",
  header = TRUE
)

更一般的方法可以让您直接使用self_select个预测变量:

all_preds <- function(dat, predictors) {
  unlist(lapply(predictors, function(x) names(dat)[which(dat[x, ] == 1 )]))
}

dat[all_preds(dat, c("A", "B"))]

  B C D F H I A E G J
A 1 1 1 1 1 1 0 0 0 0
B 0 0 0 0 0 0 1 1 1 1
C 0 0 1 0 0 0 0 1 0 0
D 0 1 0 1 1 0 1 0 0 1
E 1 0 1 1 0 1 0 0 1 0
F 0 1 0 0 0 0 0 0 1 0
G 1 0 1 0 0 0 0 0 0 0
H 0 1 0 1 0 0 1 0 0 1
I 1 0 1 0 0 0 0 1 1 0