行のフィルタリング
CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 44/64。
各行に1つの値を持つ論理ベクトルは、TRUE である行を選択します。これをコンマの前に置き、すべての列を保持するために列側は空のままにします。
people <- data.frame(
name = c("ada", "bo", "cy"),
age = c(36, 22, 41),
city = c("london", "paris", "rome")
)
print(people[people$age > 30, ])
print(nrow(people[people$age > 30, ]))出力:
name age city
1 ada 36 london
3 cy 41 rome
[1] 2条件を &(両方)と |(いずれか)で組み合わせます。それぞれの部分は列全体を比較するため、結果は引き続き行ごとに1つの値になります。
people <- data.frame(
name = c("ada", "bo", "cy"),
age = c(36, 22, 41),
city = c("london", "paris", "rome")
)
print(people[people$age > 30 & people$city == "london", ])
print(people$name[people$age < 25 | people$city == "rome"])出力:
name age city
1 ada 36 london
[1] "bo" "cy"subset(df, condition)は、内部で列名を直接使用できるため、より短いコードで同じことを行います。
people <- data.frame(
name = c("ada", "bo", "cy"),
age = c(36, 22, 41),
city = c("london", "paris", "rome")
)
older <- subset(people, age > 30)
print(older$name)出力:
[1] "ada" "cy" どの行にも一致しない場合、結果は0行のデータフレームになるため、そこから読み取る前にnrow()を確認します:
people <- data.frame(
name = c("ada", "bo", "cy"),
age = c(36, 22, 41),
city = c("london", "paris", "rome")
)
nobody <- people[people$age > 90, ]
print(nrow(nobody))
print(if (nrow(nobody) == 0) "none" else nobody$name[1])出力:
[1] 0
[1] "none"チャレンジ
簡単adults_in(df, city)を完成させてください。dfにはname、age、cityの列があります。18歳以上でcityに住んでいる人の名前を、行の順序で, を使って結合して返すか、該当する人がいない場合はnoneを返してください。
提供されたコードは、read.csv(text = input)を使って入力から表を読み取ります。最初の行には列名が入り、その後の各行が1つの行となり、値はコンマで区切られています。入力の最後の行には都市名が入り、コードは返された値を出力します。
自分で試してみよう
adults_in <- function(df, city) {
# ここにコードを書いてください
"none"
}
# 提供された入出力コード: そのままにしておいてください
input <- suppressWarnings(readLines(file("stdin")))
df <- read.csv(text = input[-length(input)])
cat(adults_in(df, input[length(input)]), sep = "\n")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ