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 30split()と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チャレンジ
簡単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")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ