繁体   English   中英

从矩阵中提取观察值,其中列和行与“键”匹配

[英]extracting observations from matrix where columns and rows match a “key”

给定一个矩阵m如何可以创建一个TRUE / FALSE1 / 0矩阵,其中列和行匹配在数据帧中的一些“键”?

我的目标是为矩阵中的列与cols匹配且rowscolsrows_df的行相匹配的位置分配10 然后,基本上只是将观察结果提取为真,或者将其粘贴到正确列旁边的colsrows_df

下面的forloop只是创建对角10

     m <- matrix(runif(30), nrow = 20, ncol = 20)

    dimnames(m) <- list(c(paste0("ID", 1:5, "_2000"), paste0("ID", 1:5, "_2001"), paste0("ID", 1:5, "_2002"), paste0("ID", 1:5, "_2003")),
                        c(paste0("ID", 1:5, "_2000"), paste0("ID", 1:5, "_2001"), paste0("ID", 1:5, "_2002"), paste0("ID", 1:5, "_2003")))




    cols <- colnames(m)
    rows <- rownames(m)

    library(tidyr)

    library(dplyr)
    colsrows <- cbind(cols, rows)

# Here I just separate the rows/cols and then add an extra year and paste them back together

    colsrows_df <- colsrows %>%
      data.frame %>%
      separate(cols, c("id_col", "year_col"), "_", remove = FALSE) %>%
      separate(rows, c("id_row", "year_row"), "_", remove = FALSE) %>%
      mutate(year_row_plus_1 = as.numeric(year_row) + 1,
             rows = paste0(id_row,"_", year_row_plus_1)) %>%
      select(cols, rows)


    colsrows_df

    for(i in 1:nrow(colsrows)){
      m[i, ] <- colnames(m) == colsrows_df$cols
      m[, i] <- rownames(m) == colsrows_df$rows
    }
    m

编辑:

这似乎可以“解决”问题,但是我不确定它是否强大。

ids <- colsrows_df[colsrows_df$cols %in% colnames(m) & 
                     colsrows_df$rows %in% rownames(m), ]

res <- melt(m[as.matrix(colsrows_df[colsrows_df$cols %in% colnames(m) & 
                          colsrows_df$rows %in% rownames(m), ][2:1])])

cbind(ids, res)

我觉得你可以先过滤colsrows_dfrownamescolnames这些都是实际存在的m然后更改列的顺序,转化为矩阵,用它来子集m和改变这些值设置为1。

m[as.matrix(colsrows_df[colsrows_df$cols %in% colnames(m) & 
                       colsrows_df$rows %in% rownames(m), ][2:1])] <- 1

然后将剩余的转换为0

m[m != 1] <- 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM