您好我的文件结构如下:
> 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
答案 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 . . . . . . . . . .