Caterpillar - 10 months ago 43

R Question

I have a vector let's say

x <- 1:1000

and I want to extract the multiples of 8 from it.

What should I do?

(I don't want to do x[-c(8,16,24,....etc)] )

The goal is to remove the multiples of 8 from the x vector

Answer Source

For this you can use the modulo operator, i.e. `%%`

. Take for example:

```
> 322%%8
[1] 2
```

which tells you that after dividing 322 by 8, 2 remains, i.e. 320 is exactly 40 times 8, leaving 2.

In you example we can use `%%`

combined with subsetting to get the the multiples of 8. Remember that `%%`

yields 0 for exact multiples of 8:

```
input = 1:1000
multiple_of_8 = (input %% 8) == 0
head(multiple_of_8)
[1] FALSE FALSE FALSE FALSE FALSE FALSE
length(multiple_of_8)
[1] 1000
```

also note that `%%`

is a vectorized operation, i.e. of the left hand side is a vector, the result will also be a vector. The `multiple_of_8`

vector now contains 1000 logicals stating if that particular element of `input`

is an exact multiple of 8. Using that logical vector to subset get's you the result you need:

```
input[multiple_of_8]
[1] 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120
[16] 128 136 144 152 160 168 176 184 192 200 208 216 224 232 240
[31] 248 256 264 272 280 288 296 304 312 320 328 336 344 352 360
[46] 368 376 384 392 400 408 416 424 432 440 448 456 464 472 480
[61] 488 496 504 512 520 528 536 544 552 560 568 576 584 592 600
[76] 608 616 624 632 640 648 656 664 672 680 688 696 704 712 720
[91] 728 736 744 752 760 768 776 784 792 800 808 816 824 832 840
[106] 848 856 864 872 880 888 896 904 912 920 928 936 944 952 960
[121] 968 976 984 992 1000
```

or more compactly:

```
input[(input %% 8) == 0]
```