从R中的不同列表中减去元素(如果存在)

时间:2013-11-28 11:00:09

标签: r list difference

我有一个由以下内容生成的表格列表:

c <- list(table(Y1['2001']$C), table(Y1['2002']$C), table(Y1['2003']$C), table(Y1['2004']$C), table(Y1['2005']$C), table(Y1['2006']$C), table(Y1['2007']$C), table(Y1['2008']$C), table(Y1['2009']$C), table(Y1['2010']$C), table(Y1['2011']$C))

使用:

> str(c)
List of 11
 $ : 'table' int [1:59(1d)] 341 60 161 164 735 282 82 240 160 172 ...
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr [1:59] "AR" "AS" "AU" "BE" ...
 $ : 'table' int [1:60(1d)] 258 94 178 133 4 747 301 1 122 252 ...
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr [1:60] "AR" "AS" "AU" "BE" ...
 $ : 'table' int [1:60(1d)] 195 116 287 149 1 71 736 303 168 217 ...
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr [1:60] "AR" "AS" "AU" "BE" ...
 $ : 'table' int [1:63(1d)] 235 110 395 115 123 551 280 10 185 234 ...
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr [1:63] "AR" "AS" "AU" "BE" ...
 $ : 'table' int [1:64(1d)] 248 98 438 121 2 138 584 280 261 1 ...
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr [1:64] "AR" "AS" "AU" "BE" ...
 $ : 'table' int [1:65(1d)] 209 102 544 123 139 535 281 26 326 179 ...
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr [1:65] "AR" "AS" "AU" "BE" ...
 $ : 'table' int [1:72(1d)] 217 104 573 119 2 160 500 280 65 313 ...
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr [1:72] "AR" "AS" "AU" "BE" ...
 $ : 'table' int [1:74(1d)] 205 104 551 116 27 162 533 292 64 294 ...
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr [1:74] "AR" "AS" "AU" "BE" ...
 $ : 'table' int [1:75(1d)] 208 112 580 124 24 179 569 289 63 255 ...
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr [1:75] "AR" "AS" "AU" "BE" ...
 $ : 'table' int [1:77(1d)] 204 110 592 108 24 181 581 318 64 299 ...
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr [1:77] "AR" "AS" "AU" "BE" ...
 $ : 'table' int [1:92(1d)] 1 217 111 593 100 39 24 194 703 386 ...
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr [1:92] "AE" "AR" "AS" "AU" ...

> c #sample of the first 2 tables.There are 11 in total.
[[1]]

 AR  AS  AU  BE  BZ  CA  CH  CL  CO  CZ  DE  EC  ES  FI  FR  GE  GO  GR  HK  HR  HU  ID  IN  IR  IS  IT  JN  LN  LV  LY  MA  MX  NE  NG  NO  NZ  PD  PE  PH  PO  SA  SI  SK  SO  SP    SV  SW  SZ  TA  TH  TU  TZ UK  UR  US  VZ  ZA  ZI  ZM 
341  60 161 164 735 282  82 240 160 172 217 435  98 164 348 625   2  34 237  39 154 284 150 138  47 344 447  69 117   2  80 193 162   2 211 130 179 175 443 160 296 250 262  77 165  26 242 166 340 291  99   3  685  76 657 567   2  14   2 

[[2]]

 AR  AS  AU  BE  BO  BZ  CA  CD  CH  CL  CM  CO  CZ  DE  EC  EG  ES  FI  FR  GE  GO  GR   HK  HR  HU  IC  ID  IN  IR  IS  IT  JN  LN  LV  MA  MX  NE  NO  NZ  PD  PE  PH  PO  RU  SA      SI  SK  SO  SP  SV  SW  SZ  TA  TH  TU  UK  UR  US  VZ  ZI 
258  94 178 133   4 747 301   1 122 252   1 180 184 170 624   1 112 167 357 668   2  62 246 142 151  19 308 140 151 130 389 591  99 104 110 150 175 249 133 253 141 386 168  11 325 312 312 103 198  71 273 165 332 245  96 777 135 651 617   4 

我的目的是计算每个元素的差异:c [[i + 1]] [j] -c [[i]] [j]对于所有j,如果在dimnames相等的条件下存在。所以我想要计算:c [[2]] AR-c [[1]] AR和c [[2]] AS-c [[1]] AS等等。

我试过了:

 > c[[2]][1]-c[[1]][1]
 AR 
-83 

这正是我正在寻找的结果,如果dimanmes相等。问题是某些元素在第二个列表中处于不同的位置,所以我不能简单地在所有元素上运行循环。

此外,我尝试过各种各样的操作:

> match(c[[1]],c[[2]])
 [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 21 NA NA NA NA NA 36 NA NA NA NA NA NA 21 NA NA NA 21 NA 30 NA 37 NA NA NA NA NA NA 52 NA NA NA NA NA 33 NA NA NA NA NA 21 NA 21

> union(c[[1]],c[[2]])
  [1] 341  60 161 164 735 282  82 240 160 172 217 435  98 348 625   2  34 237  39 154 284 150 138  47 344 447  69 117  80 193 162 211 130 179 175 443 296 250 262  77 165  26 242 166 340 291  99   3 685  76
 [51] 657 567  14 258  94 178 133   4 747 301   1 122 252 180 184 170 624 112 167 357 668  62 246 142 151  19 308 140 389 591 104 110 249 253 141 386 168  11 325 312 103 198  71 273 332 245  96 777 135 651
[101] 617

与dimnames相同(union(c [[1]],c [[2]]))...

我的目标是跟踪每个元素(dimnames)随时间的变化。因此,我希望有一个矩阵或一个列表,用于存储每个元素的观察结果的变化。

希望我能正确解释我的意图。我真的被困在这里,非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您需要获取公共元素的向量,然后进行子集和减法。一个简化的例子:

x <- 1:3
names(x) <- letters[1:3]
y <- 5:2
names(y) <- letters[2:5]

common <- intersect(names(x),names(y))
x[common]-y[common]
 b  c 
-3 -1