как преобразовать кадр данных в уравнения в R одновременно - PullRequest
1 голос
/ 09 апреля 2020

У меня есть эта матрица.

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

Знаете ли вы какие-либо идеи?

спасибо .

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Вот базовый подход R к этому. Сначала мы создаем пустую матрицу нулей с размерами, определяемыми количеством столбцов уникальных символов в исходной матрице. Затем мы конвертируем матрицу в пары «координат» (строки, пары столбцов), которые указывают, где следует разместить 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
2 голосов
/ 09 апреля 2020
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(...)), предложенная { ссылка }.

...