如何将数据框转换为 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
我有这个矩阵。
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