Найти частоту элемента в матрице в R - PullRequest
0 голосов
/ 08 мая 2018

У меня есть набор данных "data" с 7 строками и 4 столбцами следующим образом:

var1       var2    var3    var4
    A        C      
    A        C       B  
    B        A       C       D
    D        B  
             B  
    D        B      
    B        C  

Я хочу создать следующую таблицу "Мат" на основе имеющихся у меня данных:

A   B   C   D
1       1   
1   1   1   
1   1   1   1
    1       1
    1       
    1       1
    1   1   1

По сути, я взял уникальные элементы из исходных данных и создал матрицу "Mat", где число строк в Mat = число строк в Data, а количество столбцов в "Mat" = количество уникальных элементов в Data (что есть, A, B, C, D)

Я написал следующий код в R:

 rule <-c("A","B","C","D")

 mat<-matrix(, nrow = dim(data)[1], ncol = dim(rule)[1])

 mat<-data.frame(mat)

 x<-rule[,1]

 nm<-as.character(x)

 names(mat)<-nm

 n_data<-dim(data)[1]

 for(i in 1:n_data)

    {

      for(j in 2:dim(data)[2])

            {

                  for(k in 1:dim(mat)[2])

                    {

                          ifelse(data[i,j]==names(mat)[k],mat[i,k]==1,0)

                  }

          }

   }

Я получаю все NA в "циновке". Кроме того, время выполнения слишком велико, потому что в моем исходном наборе данных у меня 20 000 строк и 100 столбцов в «Mat».

Любой совет будет высоко оценен. Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Используя table и rep

table(rep(1:nrow(df),dim(df)[2]),unlist(df))
  A B C D
1 1 0 1 0
2 1 1 1 0
3 1 1 1 1
4 0 1 0 1
5 0 1 0 0
6 0 1 0 1
7 0 1 1 0
0 голосов
/ 08 мая 2018

Это должно быть быстрее, чем вложенные циклы for:

> sapply(c("A", "B", "C", "D"), function(x) { rowSums(df == x, na.rm = T) })
#      A B C D
# [1,] 1 0 1 0
# [2,] 1 1 1 0
# [3,] 1 1 1 1
# [4,] 0 1 0 1
# [5,] 0 1 0 0
# [6,] 0 1 0 1
# [7,] 0 1 1 0

Данные

df <- read.table(text = "var1       var2    var3    var4
                         A          C       NA      NA
                         A          C       B       NA
                         B          A       C       D
                         D          B       NA      NA
                         NA         B       NA      NA
                         D          B       NA      NA
                         B          C       NA      NA", header = T, stringsAsFactors = F)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...