Menu
Coddy logo textTech

行のフィルタリング

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"
challenge icon

チャレンジ

簡単

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")
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: Rオンラインコンパイラ