R中列表的稀疏矩阵

时间:2015-06-16 13:07:15

标签: r list matrix statistics sparse-matrix

您好我的文件结构如下:

    > df
    LATITUDE1 LONGITUDE1 LATITUDE2 LONGITUDE2   X   V    Y   W  Cell1  Cell2
1      -71.2       -180   -71.344     178.97 -72 -72 -180 178 -26100 -25742
2      -71.0       -180   -71.300     177.70 -71 -72 -180 177 -25740 -25743
3      -70.8       -180   -71.300     177.70 -71 -72 -180 177 -25740 -25743
4      -70.6       -180   -71.444     174.30 -71 -72 -180 174 -25740 -25746
5      -70.4       -180   -71.040     175.76 -71 -72 -180 175 -25740 -25745
6      -70.2       -180   -70.499     176.33 -71 -71 -180 176 -25740 -25384
7      -70.0       -180   -70.350     177.03 -70 -71 -180 177 -25380 -25383
8      -69.8       -180   -70.995     176.40 -70 -71 -180 176 -25380 -25384
9      -69.6       -180   -71.309     171.87 -70 -72 -180 171 -25380 -25749
10     -69.4       -180   -71.015     171.42 -70 -72 -180 171 -25380 -25749

我有一些R代码总结了从Cell1级别到Cell2级别的非零转换概率:

counts <- by(df, df$Cell1, function(d) c(table(d$Cell2)/nrow(d)))

> counts1
df$Cell1: -26100
-25742 -25743 -25746 -25745 -25384 -25383 -25749 
     1      0      0      0      0      0      0 
------------------------------------------------------------ 
df$Cell1: -25740
-25742 -25743 -25746 -25745 -25384 -25383 -25749 
   0.0    0.4    0.2    0.2    0.2    0.0    0.0 
------------------------------------------------------------ 
df$Cell1: -25380
-25742 -25743 -25746 -25745 -25384 -25383 -25749 
  0.00   0.00   0.00   0.00   0.25   0.25   0.50 

我希望能够从这个列表中创建一个稀疏的转移概率矩阵(零和非零):由于我的列表元素长度不等,这是相当困难的。我已经尝试do.call,但这是不可接受的,因为我必须手动查看&#34;每个Cell级别并确定它是否应该为零。

> do.call(rbind, counts)
-25746 -25745 -25743 -25384
-26100    1.0   1.00   1.00    1.0
-25740    0.2   0.20   0.40    0.2
-25380    0.5   0.25   0.25    0.5

谢谢。

编辑:使用下面的akrins代码我得到一个表格

的矩阵
do.call(rbind, counts)
       -25742 -25743 -25746 -25745 -25384 -25383 -25749
-26100      1    0.0    0.0    0.0   0.00   0.00    0.0
-25740      0    0.4    0.2    0.2   0.20   0.00    0.0
-25380      0    0.0    0.0    0.0   0.25   0.25    0.5

我期待表格的结果

    A    B    C    D
A  aa    0   ac    0
B  ba   bb    0   bd
C   0   cb    0    0
D   0   db    0    0

1 个答案:

答案 0 :(得分:1)

当给定因子时,table函数为每个级别创建一个条目。

如果我理解正确,这就是你想要的:

df <- read.table(text="    LATITUDE1 LONGITUDE1 LATITUDE2 LONGITUDE2   X   V    Y   W  Cell1  Cell2
1      -71.2       -180   -71.344     178.97 -72 -72 -180 178 -26100 -25742
2      -71.0       -180   -71.300     177.70 -71 -72 -180 177 -25740 -25743
3      -70.8       -180   -71.300     177.70 -71 -72 -180 177 -25740 -25743
4      -70.6       -180   -71.444     174.30 -71 -72 -180 174 -25740 -25746
5      -70.4       -180   -71.040     175.76 -71 -72 -180 175 -25740 -25745
6      -70.2       -180   -70.499     176.33 -71 -71 -180 176 -25740 -25384
7      -70.0       -180   -70.350     177.03 -70 -71 -180 177 -25380 -25383
8      -69.8       -180   -70.995     176.40 -70 -71 -180 176 -25380 -25384
9      -69.6       -180   -71.309     171.87 -70 -72 -180 171 -25380 -25749
10     -69.4       -180   -71.015     171.42 -70 -72 -180 171 -25380 -25749")

levels <- unique(c(df$Cell1, df$Cell2))
df$Cell1 <- factor(df$Cell1, levels=levels)
df$Cell2 <- factor(df$Cell2, levels=levels)
t <- table(df$Cell1, df$Cell2)

require("Matrix")
mat <- Matrix(t, sparse=T)

这会产生:

>t

         -26100 -25740 -25380 -25742 -25743 -25746 -25745 -25384 -25383 -25749
  -26100      0      0      0      1      0      0      0      0      0      0
  -25740      0      0      0      0      2      1      1      1      0      0
  -25380      0      0      0      0      0      0      0      1      1      2
  -25742      0      0      0      0      0      0      0      0      0      0
  -25743      0      0      0      0      0      0      0      0      0      0
  -25746      0      0      0      0      0      0      0      0      0      0
  -25745      0      0      0      0      0      0      0      0      0      0
  -25384      0      0      0      0      0      0      0      0      0      0
  -25383      0      0      0      0      0      0      0      0      0      0
  -25749      0      0      0      0      0      0      0      0      0      0

如果您知道细胞位于例如-30000和30000只需设置levels=-30000:30000

编辑: 如果你想要概率,只需将行标准化或使用prop.table来完成它。

t <- prop.table(table(df$Cell1, df$Cell2), margin=1)

但你最终没有任何参赛作品的NaN。您应该自己标准化线条,或者如果您喜欢快速而肮脏的方式,t[is.nan(t)] <- 0

所以你最终得到:

> mat
10 x 10 sparse Matrix of class "dtCMatrix"
   [[ suppressing 10 column names ‘-26100’, ‘-25740’, ‘-25380’ ... ]]

-26100 . . . 1 .   .   .   .    .    .  
-25740 . . . . 0.4 0.2 0.2 0.20 .    .  
-25380 . . . . .   .   .   0.25 0.25 0.5
-25742 . . . . .   .   .   .    .    .  
-25743 . . . . .   .   .   .    .    .  
-25746 . . . . .   .   .   .    .    .  
-25745 . . . . .   .   .   .    .    .  
-25384 . . . . .   .   .   .    .    .  
-25383 . . . . .   .   .   .    .    .  
-25749 . . . . .   .   .   .    .    .