我有以下矩阵:
> 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))
答案 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"