Пропорции для факторных столбцов в матрице в R - PullRequest
1 голос
/ 14 января 2020

Я бы хотел вычислить пропорции уровней факторов в матрице в R.

Пример данных:

mtx <- matrix(NA, nrow=8, ncol=4)
set.seed(12)
wordclass <- c("Function", "Content", "Insert")
for(i in 1:nrow(mtx)){
  mtx[i,] <- sample(wordclass, 4, replace = T)
}
mtx
     [,1]       [,2]       [,3]       [,4]      
[1,] "Content"  "Content"  "Insert"   "Insert"  
[2,] "Content"  "Function" "Function" "Content" 
[3,] "Insert"   "Content"  "Function" "Content" 
[4,] "Function" "Content"  "Content"  "Content" 
[5,] "Insert"   "Function" "Function" "Insert"  
[6,] "Content"  "Insert"   "Content"  "Function"
[7,] "Insert"   "Content"  "Function" "Function"
[8,] "Function" "Content"  "Insert"   "Content"

Если я преобразую mtx в кадр данных, я мог бы использовать sapply для получения пропорций:

mtx_df <- as.data.frame(mtx)
props <- as.data.frame(sapply(mtx_df, function(x) prop.table(table(x))))
props
            V1    V2   V3   V4
Content  0.375 0.625 0.25 0.50
Function 0.250 0.250 0.50 0.25
Insert   0.375 0.125 0.25 0.25

Но есть ли способ получить пропорции без обхода путем преобразования кадра данных?

Ответы [ 2 ]

3 голосов
/ 14 января 2020

Вы можете использовать apply, который лучше работает с матрицами, используя MARGIN = 2 для столбцов.

apply(mtx, 2, function(x) prop.table(table(factor(x, levels = wordclass))))

#          [,1]  [,2] [,3] [,4]
#Content  0.375 0.625 0.25 0.50
#Function 0.250 0.250 0.50 0.25
#Insert   0.375 0.125 0.25 0.25
1 голос
/ 14 января 2020

Мы могли бы сделать это векторизованным способом, если мы сделаем table для col набора данных

prop.table(table(c(mtx), c(col(mtx))), 2)
#           1     2     3     4
#  Content  0.375 0.625 0.250 0.500
#  Function 0.250 0.250 0.500 0.250
#  Insert   0.375 0.125 0.250 0.250
...