合并列表中的所有元素并仅保留唯一值

时间:2016-12-30 23:23:11

标签: r list

我有一个包含多个列的数据框SCC。从这些列中我想找到所有包含"煤"在他们中间。

我使用grep函数执行此操作,并使用以下命令将结果存储在变量x(列表)中:

x <- sapply(SCC, grep, pattern="coal", ignore.case=T)

现在x告诉我在数据框中的哪个位置&#34;煤&#34;发生时,它是一个列表,下面给出了该列表的第4和第9个元素。

> x[4]
$EI.Sector
 [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16
[17]  17  18  19  20  21  22  23  24  25  26  27  28  29  30  80  81
[33]  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98
[49]  99 100 101 102 103 104 105 106 107 108 109 110 111 112 161 162
[65] 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
[81] 179 180 181 182 183 184 185 215 221 433 434 435 447 448 462 463
[97] 527 528 529

> x[9]
$SCC.Level.Three
  [1]    1    2    3    4    5    6    7    8    9   10   11   12   13
 [14]   14   15   16   17   18   19   20   21   79   80   81   83   84
 [27]   85   86   87   88   89   90   91   92   93   94   95   96   97
 [40]   98   99  100  101  102  103  104  105  161  162  163  164  165
 [53]  166  167  168  169  170  171  172  173  174  175  176  177  178
 [66]  179  180  242  433  434  435  447  448  462  463  477  478  527
 [79]  528  529 2220 2221 2222 2223 2224 2496 2497 2498 2499 2500 2501
 [92] 2502 2503 2504 2505 2506 2591 2592 4520 4673 4674 4675 4676 4677
[105] 4678 4679 4680 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424
[118] 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437
[131] 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450
[144] 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7991
[157] 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 8004
[170] 8005 8006 8007 8008 8009 9054 9055 9056 9057 9058 9059 9060

问题1

我想将x[4]x[9]合并为一个索引;我该怎么办?我现在正在使用下面的代码,但是有更简洁的命令吗?

y <- x[[4]] %in% intersect(x[[4]], x[[9]])
z <- c( x[[4]][!y], x[[9]])

> sort(z)
  [1]    1    2    3    4    5    6    7    8    9   10   11   12
 [13]   13   14   15   16   17   18   19   20   21   22   23   24
 [25]   25   26   27   28   29   30   79   80   81   83   84   85
 [37]   86   87   88   89   90   91   92   93   94   95   96   97
 [49]   98   99  100  101  102  103  104  105  106  107  108  109
 [61]  110  111  112  161  162  163  164  165  166  167  168  169
 [73]  170  171  172  173  174  175  176  177  178  179  180  181
 [85]  182  183  184  185  215  221  242  433  434  435  447  448
 [97]  462  463  477  478  527  528  529 2220 2221 2222 2223 2224
[109] 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2591
[121] 2592 4520 4673 4674 4675 4676 4677 4678 4679 4680 7415 7416
[133] 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428
[145] 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440
[157] 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452
[169] 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7991 7992
[181] 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 8004
[193] 8005 8006 8007 8008 8009 9054 9055 9056 9057 9058 9059 9060

问题2

还有其他一些单词&#34; coal&#34;在SCCx元素的长度为我们提供了关于“煤炭”这个词的概念。用于SCC。是否有一个命令可以组合x的所有元素来生成行索引?

sapply(x, NROW)
                SCC       Data.Category          Short.Name 
                  0                   0                 239 
          EI.Sector        Option.Group          Option.Set 
                 99                   0                   0 
      SCC.Level.One       SCC.Level.Two     SCC.Level.Three 
                  0                   0                 181 
     SCC.Level.Four              Map.To Last.Inventory.Year 
                126                   0                   0 
       Created_Date        Revised_Date         Usage.Notes 
                  0                   0                   0 

1 个答案:

答案 0 :(得分:3)

(回答评论)

你没有做z <- union(x[[4]], x[[9]])吗?

  

union完成这项工作,有没有办法同时对x的所有元素进行联合?

     

union()只需要两个向量;还有另一个函数可以将x的所有元素作为参数吗?

我们可以简单地做到

unique(unlist(x))

如果您想继续使用union,请执行:

Reduce(union, x)