103  練習問題(解答)

library(tidyverse)

それでは解答です。

103.0.1 Logical

練習問題1

Logical型2種類はなんでしょうか?またその短縮した書き方を書いてください

TRUE
[1] TRUE
FALSE
[1] FALSE

が2種類です。短縮するなら

T
[1] TRUE
F
[1] FALSE

-1

Logical型を数字に変換した場合と文字列に変換した場合をそれぞれ実行してみてください

as.numeric(c(T,F))
[1] 1 0
as.character(c(T,F))
[1] "TRUE"  "FALSE"

-2

次のうち、FALSEとなるのはどれでしょうか?

as.logical(-1)
[1] TRUE
as.logical(0)
[1] FALSE
as.logical(1)
[1] TRUE
as.logical(2)
[1] TRUE

練習問題3

TRUE + TRUEの結果は何になりますか?

T + T
[1] 2

103.0.2 ==オペレーター

練習問題4

a <- 10
b <- ""

a == b #がTRUEとなる値をbに入れてください。
[1] FALSE
a <- 10
b <- 10
a == b
[1] TRUE

103.0.3 比較オペレーター

練習問題5 

次の実行結果がすべてTRUEとなるように==以外を用いて書き換えてくださいまた、各オペレーターは1回のみ利用できます(答えは複数あります)>, <, >=, <=, !=,

5 <  6 #5 == 6
[1] TRUE
5 <= 6 #5 == 6
[1] TRUE
5 != 6 #5 == 6
[1] TRUE
5 >  4 #5 == 4
[1] TRUE
5 >= 4 #5 == 4
[1] TRUE
5 != 4 #5 == 4
[1] TRUE
5 <= 5 #5 == 5
[1] TRUE
5 >= 5 #5 == 5
[1] TRUE
"dog" <= "dog" #"dog" == "dog"
[1] TRUE
"dog" >= "dog" #"dog" == "dog"
[1] TRUE

103.0.4 ベクトルとロジカル

練習問題6

次のスクリプトの実行結果がどうなるか、予想してみてください。

vec <- c(1,2,3,4,5)

vec[TRUE]
[1] 1 2 3 4 5

これは、c(T,T,T,T,T)と同じ意味になります。

vec[c(T,T,T,T,F)]
[1] 1 2 3 4

これは、そのまま、Tがある部分が取り出されます

vec[c(T,F)]
[1] 1 3 5

これの動作、少しわかりにくいかもしれませんが、

1 2 3 4 5 T F T F T F

とベクトルの長さが不一致の場合、短いほうのベクトルが「繰り返される」ので、このような結果になります

vec[vec < 3]
[1] 1 2

これは

vec < 3
[1]  TRUE  TRUE FALSE FALSE FALSE

のT、FのTの位置がとりだされているだけですね。

103.0.5 ロジカルオペレーターと!

練習問題7

次の &オペレーターの左側のベクトルに!をを書き足して、実行結果がすべてTRUEとなるようにしてください。

c(T,F,T,F,T) & c(T,T,T,T,T)
[1]  TRUE FALSE  TRUE FALSE  TRUE
T&T#が唯一TRUEと返ってくるので、
[1] TRUE

FALSEの前に!でTRUEに変換してあげましょう

c(T,!F,T,!F,T) & c(T,T,T,T,T)
[1] TRUE TRUE TRUE TRUE TRUE

練習問題8

次の |オペレーターの左側のベクトルに!をを書き足して、実行結果がすべてFALSEとなるようにしてください。

c(T,F,T,F,T) | c(F,F,F,F,F)
[1]  TRUE FALSE  TRUE FALSE  TRUE

Fと返ってくるのが、F|Fの時だけなので、

c(!T,F,!T,F,!T) | c(F,F,F,F,F)
[1] FALSE FALSE FALSE FALSE FALSE

練習問題9

次のvecからvec[…]の書き方を使って

9-1 3をとりだしてください 9-2 2の倍数を取り出してください 9-3 7の倍数を取り出してください 9-4 奇数をとりだしてください。 9-5 3の倍数かつ5の倍数あるいは4の倍数かつ7の倍数をとりだしてください。

vec <- c(1:50)

9-1 3をとりだしてください

vec[vec==3]
[1] 3

9-2 2の倍数を取り出してください

vec[vec %% 2 == 0]
 [1]  2  4  6  8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50

9-3 7の倍数を取り出してください

vec[vec %% 7 == 0]
[1]  7 14 21 28 35 42 49

9-4 奇数をとりだしてください。

vec[vec %% 2 == 1]
 [1]  1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49

9-5 3の倍数かつ5の倍数あるいは4の倍数かつ7の倍数をとりだしてください。

複雑な条件の場合、ロジカルを分けて作成すると見通しがよくなります

baisu3and5 <- (vec %% 3 == 0) & (vec %% 5 == 0)
baisu4and7 <- (vec %% 4 == 0) & (vec %% 7 == 0)

vec[baisu3and5]
[1] 15 30 45
vec[baisu4and7]
[1] 28
vec[baisu3and5 | baisu4and7]
[1] 15 28 30 45

できました。ちなみに、1行でかきたいのであれば、

vec[((vec %% 3 == 0) & (vec %% 5 == 0))|((vec %% 4 == 0) & (vec %% 7 == 0))]
[1] 15 28 30 45

と、かなりわかりにくくなります。

ただし、複雑な場合でも、次のような形で書いても大丈夫なので、

vec[ 
  ( (vec %% 3 == 0) & (vec %% 5 == 0) ) 
   | 
  ( (vec %% 4 == 0) & (vec %% 7 == 0) ) 
]
[1] 15 28 30 45

特に誰かとスクリプトを共有する場合は分かりやすくする意味で改行やスペースをうまく使えるとよいと思います。

お疲れさまでした。それでは、ここで学んだLogical型を利用して、行の操作の関数を学んでいきます