Menu
Coddy logo textTech

split()によるグループ化

CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 39/64。

split(values, groups) は、各値を groups の対応する要素によって名前が付けられたグループに入れます。結果はグループごとに1つの要素を持つリストで、グループ名は並べ替えられた順序で付けられます。

amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
by_cat <- split(amounts, category)
print(names(by_cat))
print(by_cat[["food"]])

出力:

[1] "food" "fun"  "rent"
[1] 10 30

split() と sapply() を組み合わせて、グループごとに 1 つの要約を計算します。

amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
by_cat <- split(amounts, category)
print(sapply(by_cat, sum))
print(sapply(by_cat, length))

出力:

food  fun rent 
  40   40   20 
food  fun rent 
   2    1    1 

値にはテキストを使用することもできます。たとえば、名前を最初の文字でグループ化する場合です。

names <- c("ana", "bo", "al", "bea", "cy")
groups <- split(names, substr(names, 1, 1))
for (letter in names(groups)) {
  cat(letter, ":", paste(groups[[letter]], collapse = ", "), "\n")
}

出力:

a : ana, al 
b : bo, bea 
c : cy 

グループは少なくとも1つの値が属している場合にのみ存在するため、空である可能性のあるグループを読み取る前に、%in% names()で確認します。

by_cat <- split(c(5, 7), c("food", "food"))
print("rent" %in% names(by_cat))

出力:

[1] FALSE
challenge icon

チャレンジ

簡単

category_totals(amounts, categories)を完成させてください。カテゴリごとに、アルファベット順で1行ずつ、food: 40 (2 items)の形式で、そのカテゴリの合計金額と金額の個数を返してください。

提供されたコードは、金額とカテゴリを同じ長さのカンマ区切りの2行として読み込み、返された各行を出力します。

自分で試してみよう

category_totals <- function(amounts, categories) {
  # ここにコードを書いてください
  character(0)
}

# 提供された入力/出力コード:そのままにしておいてください
input <- suppressWarnings(readLines(file("stdin")))
cat(category_totals(as.numeric(strsplit(input[1], ",")[[1]]), strsplit(input[2], ",")[[1]]), sep = "\n")
quiz icon腕試し

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

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

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