【问题标题】:Automatic subsetting of a dataframe on the basis of a prediction matrix基于预测矩阵的数据帧的自动子集化
【发布时间】:2018-12-08 17:32:36
【问题描述】:

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

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")]

然而,我想自动化这个过程。谁能告诉我如何做到这一点?

【问题讨论】:

    标签: r matrix subset r-mice


    【解决方案1】:

    这是一种似乎适合您的策略:

    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
    

    【讨论】:

    • 非常感谢内特!代码看起来真的很不错!我立即尝试看看它是否有效。但是由于某种原因,结果是[1] NA。有什么我做错的吗?
    • 我自己试过first_preds,结果是NULL
    • 好的,我解决了。问题是我的预测矩阵实际上是一个矩阵。我将它转换为数据框,然后它工作了!非常感谢!
    • @Tom 添加了一些我认为可以让您直接传递辅助预测变量的内容
    • 不确定我是否完全遵循,也许您添加对unique(unlist(....)) 的调用的想法会解决它?
    猜你喜欢
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    相关资源
    最近更新 更多