Нахождение наиболее частого значения char в матрице в ошибке R - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующая матрица:

> a
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
  [1,] "F"  "I"  "I"  "I"  "M"  "F"  "I"  "I"  NULL NULL 
  [2,] "M"  "M"  "I"  "I"  "I"  "I"  "I"  "M"  "M"  NULL 
  [3,] "M"  "M"  NULL "M"  "F"  "M"  NULL "M"  "M"  "M"  
  [4,] "M"  "F"  "M"  "M"  "F"  "F"  "M"  "M"  "F"  "F"  
  [5,] "M"  "I"  NULL "I"  "I"  "I"  "I"  "I"  "I"  "I"  
  [6,] "I"  "I"  "I"  "I"  "M"  NULL "I"  "I"  "M"  "M"  
  [7,] "I"  "I"  "I"  "I"  NULL "I"  "F"  "I"  "I"  "I"  
  [8,] "I"  "I"  NULL "I"  "F"  "I"  "F"  "I"  "I"  "I"  
  [9,] "M"  "M"  "M"  "M"  "F"  "F"  NULL "M"  "F"  "M"  
 [10,] NULL "F"  NULL "F"  "F"  "F"  "M"  "F"  "F"  "F"  
 [11,] NULL "M"  NULL "F"  "F"  "M"  NULL "M"  "F"  "M"  
 [12,] "M"  "M"  "M"  "M"  "M"  NULL "F"  "M"  "F"  "M"  
 [13,] "I"  NULL "M"  "F"  NULL "F"  "M"  NULL "M"  "F"  
...

Я хотел бы добавить столбец, который будет включать в себя наиболее распространенные символы (значения NULL можно игнорировать) в каждой строке (строке).Например, для строк 1 и 2 ответом является "I".Для строки 3 - "M" и т. Д. Я пытался использовать

> max.col (a)
Error in max.col(a) : (list) object cannot be coerced to type 'double'

> str (a)
List of 8360
 $ : chr "F"
 $ : chr "M"
 $ : chr "M"
 $ : chr "M"
...
 $ : chr "I"
 $ : chr "F"
  [list output truncated]
 - attr(*, "dim")= int [1:2] 836 10

> class (a)
[1] "matrix"

Даже пробовал это:

 g <- function(df)
    {
      X <- as.data.frame(t(apply( df, 1,
                                  function(row)
                                  {
                                    u <- unique(row)
                                    n <- rowSums(outer(u,row,"=="))
                                    if (length(u)==1 )
                                    {
                                      c(row,u[which.max(n)],max(n),"",0)
                                    }
                                    else
                                    {
                                      c(row,u[which.max(n)],max(n),u[which.min(n)],min(n))
                                    }
                                  })))  

      colnames(X) <- c(colnames(df),"max_res","max_num","min_res","min_num")

      return(X)
    }
    a<-data.frame(a)
    g1<-g(a)

получил:

 Error in FUN(X, Y, ...) : comparison of these types is not implemented 

> dput(head(a, 10))
structure(list("F", "M", "M", "M", "M", "I", "I", "I", "M", NULL, 
    "I", "M", "M", "F", "I", "I", "I", "I", "M", "F", "I", "I", 
    NULL, "M", NULL, "I", "I", NULL, "M", NULL, "I", "I", "M", 
    "M", "I", "I", "I", "I", "M", "F", "M", "I", "F", "F", "I", 
    "M", NULL, "F", "F", "F", "F", "I", "M", "F", "I", NULL, 
    "I", "I", "F", "F", "I", "I", NULL, "M", "I", "I", "F", "F", 
    NULL, "M", "I", "M", "M", "M", "I", "I", "I", "I", "M", "F", 
    NULL, "M", "M", "F", "I", "M", "I", "I", "F", "F", NULL, 
    NULL, "M", "F", "I", "M", "I", "I", "M", "F"), .Dim = c(10L, 
10L))
> dput (a)
structure(list("F", "M", "M", "M", "M", "I", "I", "I", "M", NULL, 
    NULL, "M", "I", "F", "I", "F", NULL, NULL, "F", "I", "F", 
    NULL, "F", "I", NULL, "F", "F", "F", "I", "M", "F", "F", 
    NULL, "I", NULL, "M", "M", "F", "F", "M", "F", "I", "I", 
    "M", "F", "M", "I", "I", "F", "I", "M", "F", "M", "M", "I", 
    "I", "M", "M", "M", "M", "M", "I", "F", "F", "F", "M", "I", 
    "I", "I", "I", "F", "I", "I", "I", "M", "I", NULL, "M", "M", 
    "M", "F", "F", "M", "M", "F", "F", NULL, NULL, "I", "M", 
    "I", "I", NULL, NULL, "F", NULL, NULL, "I", "F", "F", "F", 
    "I", "I", NULL, "M", "M", "I", "I", "I", "F", "M", "I", "F", 
    "M", "F", "M", NULL, "M", "F", "I", "M", "I", NULL, "I", 
    "M", "I", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
...
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL, NULL), .Dim = c(836L, 10L))

1 Ответ

0 голосов
/ 29 ноября 2018

Это для вашего dput(head(a, 10)).

apply(X = a, MARGIN = 1, FUN = function(x){
    x = x[!sapply(x, is.null)]
    with(data = as.data.frame(table(unlist(x))),
         expr = toString(Var1[which(Freq == max(Freq))]))
})
# [1] "I"    "I"    "M"    "F, M" "I"    "I"    "I"    "I"    "M"    "F"

Если вы хотите, чтобы только один символ из каждой строки использовал

apply(X = a, MARGIN = 1, FUN = function(x){
    x = x[!sapply(x, is.null)]
    with(data = as.data.frame(table(unlist(x))),
         expr = toString(Var1[which.max(Freq)]))
})
# [1] "I" "I" "M" "F" "I" "I" "I" "I" "M" "F"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...