4

列ごとにマトリックスの頻度を見つけたい。たとえば、以下の行列 x の場合

   x <- matrix(c(rep(1:4,3),rep(2:5,2)),4,5)
   x
         [,1] [,2] [,3] [,4] [,5]
   [1,]    1    1    1    2    2
   [2,]    2    2    2    3    3
   [3,]    3    3    3    4    4
   [4,]    4    4    4    5    5

各一意の列の頻度を見つけて、各列が x の一意の列であり、最後の行が行列 x の頻度として追加される行列を作成する方法

 #freqmatrix
        [,1] [,2]
 [,1]      1  2
 [,2]      2  3
 [,3]      3  4
 [,4]      4  5
 [,5]      3  2
4

4 に答える 4

5

これは、行列をリストのリストに変換することを回避する解決策ですが、少し面倒です:

x.unique <- unique(x, MARGIN  = 2)

freq <- apply(x.unique, MARGIN = 2, 
              function(b) sum(apply(x, MARGIN = 2, function(a) all(a == b)))
        )

rbind(x.unique, freq)

     [,1] [,2]
        1    2
        2    3
        3    4
        4    5
freq    3    2
于 2013-01-21T09:12:57.070 に答える
3

正確には、あなたの最終目標は何ですか?言い換えれば、このデータをさらにどのように扱うつもりですか? 集計だけpaste()だと答えが出ない?

x <- matrix(c(rep(1:4,3),rep(2:5,2)),4,5)
x1 <- data.frame(table(apply(x, 2, paste, collapse = ", ")))
#         Var1 Freq
# 1 1, 2, 3, 4    3
# 2 2, 3, 4, 5    2

Var1分離したい場合はread.csv()、その列で使用できます。

cbind(read.csv(text = as.character(x1$Var1), header = FALSE), x1[-1])
#   V1 V2 V3 V4 Freq
# 1  1  2  3  4    3
# 2  2  3  4  5    2

または、出力を転置したい場合:

t(cbind(read.csv(text = as.character(x1$Var1), header = FALSE), x1[-1]))
#      [,1] [,2]
# V1      1    2
# V2      2    3
# V3      3    4
# V4      4    5
# Freq    3    2
于 2013-01-21T15:49:20.490 に答える
2

この答えは、避けられなかったリストのリストが含まれているため、少し面倒です。

x <- matrix(c(rep(1:4,3),rep(2:5,2)),4,5)
#convert columns to elements in list
y <- apply(x, 2, list)

#Get unique columns
unique_y <- unique(unlist(y, recursive=FALSE))

#Get column frequencies
frequencies <- sapply(unique(y), function(f) sum(unlist(y, recursive=FALSE) %in% f))

#Bind unique columns with frequencies
rbind(simplify2array(unique_y), frequencies)

そして見よ:

            [,1] [,2]
               1    2
               2    3
               3    4
               4    5
frequencies    3    2
于 2013-01-21T08:45:13.780 に答える
2

使用する1つのライナーaggregate(入力が a の場合data.frame):

y <- matrix(c(1:4, 2:5, 1:4, 1,3,4,5, 2:5), ncol=5)
> y
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    2    1    1    2
# [2,]    2    3    2    3    3
# [3,]    3    4    3    4    4
# [4,]    4    5    4    5    5

z <- as.data.frame(t(y))
> t(aggregate(z, by=z, length)[1:(ncol(z)+1)])
#      [,1] [,2] [,3]
# V1      1    1    2
# V2      2    3    3
# V3      3    4    4
# V4      4    5    5
# V1.1    2    1    2

注:入力行列の列数がxnrows よりも大きい場合、つまりncol(x) >> nrow(x).

于 2013-01-21T10:20:03.830 に答える