如何将数据框转换为 R 中的联立方程

how to transform data frame to simultaneous equations in R

我有这个矩阵。

mat<-c("A","NODATA","NODATA","NODATA","A","B","C","NODATA","A","B","C","NODATA","D","E","A","NODATA","D","B","A","NODATA")
mat2 <- matrix(mat<-c("A","NODATA","NODATA","NODATA","A","B","C","NODATA","A","B","C","NODATA","D","E","A","NODATA","D","B","A","NODATA"),nrow = 4,ncol = 5)
mat3<-t(mat2)
colnames(mat3)<-c("col1","col2","col3","col4")
mat3

     col1 col2     col3     col4    
[1,] "A"  "NODATA" "NODATA" "NODATA"
[2,] "A"  "B"      "C"      "NODATA"
[3,] "A"  "B"      "C"      "NODATA"
[4,] "D"  "E"      "A"      "NODATA"
[5,] "D"  "B"      "A"      "NODATA"

我想在 R 中如下更改数据框。

A B C D E NODATA
1 0 0 0 0 1
1 1 1 0 0 1
1 1 1 0 0 1
1 0 0 1 1 1
1 1 0 1 1 1

你有什么想法吗?

谢谢。

library(dplyr)
data.frame(rows=seq_len(nrow(mat3))[row(mat3)], values=c(mat3)) %>%
  mutate(a=1) %>%
  pivot_wider(id_cols="rows", names_from="values", values_from="a", values_fn=list(a=length)) %>%
  mutate_all(~ +!is.na(.)) %>%
  select(-rows) %>%
  select(sort(colnames(.)))
# # A tibble: 5 x 6
#       A     B     C     D     E NODATA
#   <int> <int> <int> <int> <int>  <int>
# 1     1     0     0     0     0      1
# 2     1     1     1     0     0      1
# 3     1     1     1     0     0      1
# 4     1     0     0     1     1      1
# 5     1     1     0     1     0      1

建议的第一行(data.frame(...))。

这是一个基本的 R 方法。我们首先创建一个空的零矩阵,其维度由原始矩阵中唯一字符的列数决定。然后,我们将矩阵转换为 "coordinates" 对(行,列对),指示 1 应该放置的位置并替换为

mat3_pairs <- cbind(c(row(mat3)), c(mat3))
new_mat <- matrix(rep(0, length(unique(mat3_pairs[,2])) * nrow(mat3)), nrow = nrow(mat3))
colnames(new_mat) <- sort(unique(df$col))
rownames(new_mat) <- as.character(1:nrow(mat3))
new_mat[mat3_pairs] <- 1
new_mat

输出

  A B C D E NODATA
1 1 0 0 0 0      1
2 1 1 1 0 0      1
3 1 1 1 0 0      1
4 1 0 0 1 1      1
5 1 1 0 1 0      1