извлечение наблюдений из матрицы, где столбцы и строки соответствуют «ключу» - PullRequest
0 голосов
/ 24 апреля 2019

С учетом матрицы m как создать матрицу TRUE / FALSE или 1 / 0, в которой столбцы и строки соответствуют некоторому "ключу" во фрейме данных?

Моя цель - присвоить 1 или 0 местоположению в матрице, где столбцы соответствуют cols, а строки соответствуют rows в colsrows_df. Затем по существу просто извлеките наблюдения, где это верно, или вставьте их в colsrows_df рядом с правильными столбцами.

Нижеследующий forloop просто создает по диагонали 1 's и 0' *

     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

EDIT:

Кажется, это "решает" проблему, однако я не уверен, насколько она надежна.

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)

1 Ответ

1 голос
/ 24 апреля 2019

Я думаю, вы можете сначала отфильтровать colsrows_df с rownames и colnames, которые фактически присутствуют в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...