2013-04-28 44 views
10

Đối với ma trận (as.matrix), làm cách nào tôi có thể tạo bảng có các hàng bằng hàng của ma trận?Bảng R theo hàng ma trận

>table(matrix) 

>hist(matrix) 

hiển thị tổng tích lũy cho mỗi giá trị dữ liệu độc đáo trong ma trận, nhưng tôi muốn một bàn nơi hàng là những giá trị tương tự như mỗi hàng ma trận, và cột của bảng là tổng số lần xuất hiện của mỗi giá trị dữ liệu duy nhất trong ma trận.

ma trận Ví dụ:

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  

mong muốn bảng đầu ra:

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 
+1

Có hai hiệu quả hơn và tao nhã hơn tôi. Bạn có thể muốn cân nhắc xóa dấu kiểm khỏi câu trả lời của tôi và thay vào đó hãy đánh dấu vào một trong số những người khác (ví dụ: @GregoryDemin) –

Trả lời

8

Một thay thế là để chuyển đổi matrix của bạn đến một lâu data.frame (sử dụng stack), lúc này bạn có thể dễ dàng sử dụng table:

Đây là dữ liệu của bạn:

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"))) 

Đây là những gì nó trông giống như một lâu 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 

Đây là cách chúng ta có thể sử dụng để tạo ra các bảng mà bạn muốn:

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 
+1

rất tốt đẹp! Tôi thích giải pháp này nhiều hơn giải pháp tôi đề xuất –

2

bạn có thể sử dụng apply qua các hàng, và sau đó sử dụng mapply với một tuyên bố ifelse để lấy lại ma trận của bạn.

Giả sử X là ma trận của bạn:

# 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 
+0

Cảm ơn bạn rất nhiều, điều này rất hữu ích! – TallTree

+0

@TallTree, không sao cả. vui mừng giúp đỡ –

3

tôi đã sử dụng apply quá:

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 
7
## 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 
+0

+1 rất hay. Không rõ ràng chút nào, nhưng rất tao nhã. –

+0

wow, thực sự thanh lịch. +1! –

Các vấn đề liên quan