给出一个矩阵m
,如何创建列和行与某个“键”匹配的TRUE
/ FALSE
或1
/ 0
矩阵在数据框中?
我的目标是将1
或0
分配给矩阵中与列{cols
相匹配而行与rows
相匹配的位置1}}。然后,基本上只是将观察结果提取为真实值,或将其粘贴到正确列旁边的colsrows_df
中。
下面的forloop只是创建对角的colsrows_df
和1
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
答案 0 :(得分:1)
我认为您可以先用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