Para uma matriz (as.matrix), como posso gerar uma tabela onde as linhas são iguais às linhas da matriz?
>table(matrix)
e
>hist(matrix)
mostre a soma cumulativa para cada dado únicovalor na matriz, mas eu gostaria de uma tabela onde as linhas são o mesmo valor que cada linha da matriz, e as colunas da tabela são a ocorrência da soma de cada valor de dados único na matriz.
Exemplo de matriz:
1 2 3 4
a 5 5 4 6
b 5 5 5 5
c 8 7 6 6
d 2 6 6 6
e 7 7 5 4
Tabela de saída desejada:
2 4 5 6 7 8
a 0 1 2 1 0 0
b 0 0 4 0 0 0
c 0 0 0 2 1 1
d 1 0 0 3 0 0
e 0 1 1 0 2 0
Respostas:
8 para resposta № 1Uma alternativa é converter seu matrix
para um longo data.frame
(usando stack
), em que ponto você pode facilmente usar table
:
Aqui estão os seus dados:
mymat <- structure(c(5L, 5L, 8L, 2L, 7L, 5L, 5L, 7L, 6L, 7L, 4L, 5L, 6L,
6L, 5L, 6L, 5L, 6L, 6L, 4L), .Dim = c(5L, 4L), .Dimnames = list(
c("a", "b", "c", "d", "e"), c("1", "2", "3", "4")))
Isto é o que parece como um longo data.frame
:
head(stack(data.frame(t(mymat))))
# values ind
# 1 5 a
# 2 5 a
# 3 4 a
# 4 6 a
# 5 5 b
# 6 5 b
Aqui está como podemos usar isso para criar a tabela que você deseja:
with(stack(data.frame(t(mymat))), table(ind, values))
# values
# ind 2 4 5 6 7 8
# a 0 1 2 1 0 0
# b 0 0 4 0 0 0
# c 0 0 0 2 1 1
# d 1 0 0 3 0 0
# e 0 1 1 0 2 0
7 para resposta № 2
## source data
x=as.matrix(read.table(text="
1 2 3 4
a 5 5 4 6
b 5 5 5 5
c 8 7 6 6
d 2 6 6 6
e 7 7 5 4
"))
# result
table(rep(rownames(x),ncol(x)),c(x))
# 2 4 5 6 7 8
# a 0 1 2 1 0 0
# b 0 0 4 0 0 0
# c 0 0 0 2 1 1
# d 1 0 0 3 0 0
# e 0 1 1 0 2 0
3 para resposta № 3
eu usei apply
também:
t(apply(mat, 1, function(x) table(factor(x, levels = unique(sort(c(mat)))))))
R > mat = matrix(sample(1:8, 20, replace = T), 5, 4)
R > mat
[,1] [,2] [,3] [,4]
[1,] 5 6 1 4
[2,] 4 3 4 8
[3,] 4 8 4 3
[4,] 3 3 5 1
[5,] 1 1 3 1
R > t(apply(mat, 1, function(x) table(factor(x, levels = unique(sort(c(mat)))))))
1 3 4 5 6 8
[1,] 1 0 1 1 1 0
[2,] 0 1 2 0 0 1
[3,] 0 1 2 0 0 1
[4,] 1 2 0 1 0 0
[5,] 3 1 0 0 0 0
2 para resposta № 4
você pode usar apply
sobre as linhas e, em seguida, use mapply
com um ifelse
declaração para recuperar sua matriz.
Assumindo X
é a sua matriz:
# this will get you the values, just not in a nice matrix
tables.list <- apply(X, 1, table)
# unique values
vals <- sort(unique(c(X)))
# this will get you the matrix
results <- t(mapply(function(v, t)
ifelse(v %in% names(t), t[as.character(v)], 0), list(vals), tables.list ))
# give it names
dimnames(results) <- list(rownames(X), vals)
results
# 2 4 5 6 7 8
# a 0 1 2 1 0 0
# b 0 0 4 0 0 0
# c 0 0 0 2 1 1
# d 1 0 0 3 0 0
# e 0 1 1 0 2 0