Rには集合専用のデータ型はなく、代わりにさまざまな関数を使って、ベクトルに対して同じような操作を行います。
%in%演算子は、集合に含まれるかどうかを判定します。
2 %in% 1:10 # TRUE
12 %in% 1:10 # FALSE
関連する関数には、unique(重複を取り除く)をはじめ、2つの集合を操作するunion()、intersect()、setdiff()、setequal()があります。
> set_1 <- c("a", "b", "c", "b", "a")
> unique(set_1) # deduplicate
[1] "a" "b" "c"
> set_2 <- c('a', "c", "d")
> union(set_1, set_2) # values in either set
[1] "a" "b" "c" "d"
> intersect(set_1, set_2) # values in both sets
[1] "a" "c"
> setdiff(set_1, set_2) # values in set_1 but not set_2
[1] "b"
> setdiff(set_2, set_1) # values in set_2 but not set_1
[1] "d"
setequal(set_1, c("c", "b", "a", "b")) # are elements the same after deduplication?
[1] TRUE
いずれの場合も、set_1とset_2は変わりません。
Ozanは、これから行くロードトリップのためのプレイリストを作っています。同じ曲を2回以上聴きたくはありませんが、プレイリストが長くなりすぎて、どの曲をすでに追加したのか思い出せなくなっています。
Ozanの音楽プレイヤーのAPIは、ベクトルを扱うことしかできません。明示的なループやif/elseの条件分岐は使えません。そんなOzanを手伝ってあげましょう!
remove_duplicates関数を実装します。この関数はプレイリストを入力として受け取り、すべての曲が重複しない新しいプレイリストを返します。
> playlist <- c(
"Court and Spark - Joni Mitchell",
"Big Yellow Taxi - Joni Mitchell",
"Court and Spark - Joni Mitchell"
)
> remove_duplicates(playlist)
[1] "Court and Spark - Joni Mitchell" "Big Yellow Taxi - Joni Mitchell"
has_track関数を実装します。この関数はプレイリストと曲を入力として受け取り、そのプレイリストに曲が含まれているかどうかを示す真偽値を返します。
> playlist <- c(
"The Fashion Show - Grace Jones",
"Dr. Funkenstein - Parliament"
)
> has_track(playlist, "Dr. Funkenstein - Parliament")
[1] TRUE
> has_track(playlist, "Walking in the Rain - Grace Jones")
[1] FALSE
add_tracks関数を実装します。この関数はプレイリストと1つ以上の曲からなるベクトルを入力として受け取り、それらの曲を含む新しいプレイリストを返します。
> playlist <- c("Selma - Bijelo Dugme")
> playlist <- add_tracks(playlist, "Atomic Dog - George Clinton")
> playlist
[1] "Selma - Bijelo Dugme" "Atomic Dog - George Clinton"
> add_tracks(playlist, "Selma - Bijelo Dugme")
[1] "Selma - Bijelo Dugme" "Atomic Dog - George Clinton"
> add_tracks(playlist, c("The Chain - Fleetwood Mac", "Selma - Bijelo Dugme"))
[1] "Selma - Bijelo Dugme" "Atomic Dog - George Clinton" "The Chain - Fleetwood Mac"
delete_tracks関数を実装します。この関数はプレイリストと1つ以上の曲を入力として受け取り、それらの曲を含まない新しいプレイリストを返します。
> playlist <- c(
"The Treasure - Fra Lippo Lippi",
"After the Fall - Klaus Nomi"
)
> playlist <- delete_tracks(playlist, "The Treasure - Fra Lippo Lippi")
> playlist
[1] "After the Fall - Klaus Nomi"
> delete_tracks(playlist, "I Feel the Magic - Belinda Carlisle")
[1] "After the Fall - Klaus Nomi"
Ozanは新しい友達と出会い、ふたりの好みがどれくらい似ているのか気になります。
find_common_tracks関数を実装します。この関数は2つのプレイリストを受け取り、両方に含まれている曲だけを含む新しいプレイリストを返します。
> playlist_1 <- c("Karma - Taylor Swift", "Tired - Adele")
> playlist_2 <- c("Andromeda - Weyes Blood", "Karma - Taylor Swift")
> find_common_tracks(playlist_1, playlist_2)
[1] "Karma - Taylor Swift"