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型を利用して、行の操作の関数を学んでいきます