在R错误中找到矩阵中最频繁的值char

时间:2018-11-29 18:40:04

标签: r matrix row

我有以下矩阵:

> 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 :(得分:1)

这是给您的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"