0Pricing
R Academy · レッスン

数値型間の変換

as.integer()、as.double()、as.numeric()を安全に使います。

「数値型間の変換」はCoddyKit上の無料R Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

R における Integer と Double

R には 2 つの数値型があります。integer(L サフィックスで作成する整数)と、double(数値リテラルのデフォルトである浮動小数点数)です。通常、R は double を使用しますが、型の安全性やメモリ効率のために両者を区別することが重要です。

x_dbl <- 5        # double by default
x_int <- 5L       # integer (L suffix)

cat('typeof(5):  ', typeof(x_dbl), '
')  # double
cat('typeof(5L): ', typeof(x_int), '
')  # integer
cat('5 == 5L:    ', x_dbl == x_int, '
') # TRUE (values equal)
cat('identical:  ', identical(x_dbl, x_int), '
')  # FALSE (types differ)

as.integer() — Integer への変換

as.integer(x) は、小数部分を丸めずに切り捨てて値を integer に変換します。つまり、3.9 は 4 ではなく 3 になります。L サフィックスは整数リテラルの構文糖です。

cat('as.integer(3.7):  ', as.integer(3.7), '
')   # 3 (truncated, not 4)
cat('as.integer(3.2):  ', as.integer(3.2), '
')   # 3
cat('as.integer(-2.9): ', as.integer(-2.9), '
')  # -2 (toward zero)
cat('as.integer(10.9): ', as.integer(10.9), '
')  # 10

# Compare with round
cat('round(3.7):        ', round(3.7), '
')       # 4

as.double() と as.numeric()

as.double(x) と as.numeric(x) は同等で、どちらも double(浮動小数点)値に変換します。小数部分の精度が必要な場合に、integer を double に変換するために使用します。

count <- 7L  # integer
cat('typeof(count):         ', typeof(count), '
')

dbl_count <- as.double(count)
cat('typeof(as.double(7L)): ', typeof(dbl_count), '
')  # double
cat('Value:                 ', dbl_count, '
')           # 7

# Division automatically promotes to double
cat('7L / 2L:              ', 7L / 2L, '
')            # 3.5 (double)
cat('typeof(7L / 2L):      ', typeof(7L / 2L), '
')    # double

整数演算

R の整数演算では、+、-、* は整数を生成しますが、/ は常に double を返します。整数除算の結果も整数のままだと思っていると、予想外の結果になることがあります。

a <- 6L
b <- 3L

cat('6L + 3L =', a + b, '| typeof:', typeof(a + b), '
')  # 9 integer
cat('6L - 3L =', a - b, '| typeof:', typeof(a - b), '
')  # 3 integer
cat('6L * 3L =', a * b, '| typeof:', typeof(a * b), '
')  # 18 integer
cat('6L / 3L =', a / b, '| typeof:', typeof(a / b), '
')  # 2 DOUBLE!
cat('6L %/% 3L =', a %/% b, '| typeof:', typeof(a %/% b), '
') # 2 integer

切り捨てと丸めの違い

重要な違いがあります。as.integer() は切り捨て(小数を取り除く)を行う一方、round() は最も近い整数に丸めます。どちらの動作を意図しているのか、必ず明確にしてください。

values <- c(2.1, 2.5, 2.9, -2.1, -2.5, -2.9)

cat('Original:     ', values, '
')
cat('as.integer():  ', as.integer(values), '
')  # truncate toward 0
cat('round():       ', round(values), '
')       # banker rounding
cat('floor():       ', floor(values), '
')       # round down
cat('ceiling():     ', ceiling(values), '
')     # round up

整数オーバーフローのリスク

R の整数は 32 ビットで、約 ±21 億までの値を保持できます。この範囲を超えると、警告とともに NA になります。double はさらに大きな値(最大約 1.8 × 10^308)を保持できます。

max_int <- .Machine$integer.max
cat('Max integer:', max_int, '
')  # 2147483647

# Overflow produces NA
cat('max_int + 1L:', max_int + 1L, '
')  # NA with warning

# Double handles it fine
cat('as.double(max_int) + 1:', as.double(max_int) + 1, '
')  # 2147483648

ベクトルでの L サフィックス

各要素に L サフィックスを付けるか、数列を as.integer() に渡すことで、整数ベクトルを作成できます。コロン演算子 : は自動的に整数を生成します。

# Colon produces integers
seq_int <- 1:5
cat('1:5 typeof:', typeof(seq_int), '
')  # integer

# Explicit integer vector
vec_int <- c(10L, 20L, 30L, 40L)
cat('c(10L,...) typeof:', typeof(vec_int), '
')  # integer

# as.integer on a vector
vec_dbl <- c(1.1, 2.9, 3.5, 4.7)
cat('as.integer(c(1.1,...)):', as.integer(vec_dbl), '
')  # 1 2 3 4

メモリとパフォーマンス

整数は要素あたり 4 バイト、double は 8 バイトを使用します。非常に大きな整数ベクトルでは、integer を使用することでメモリ使用量を半分にできます。ただし、異なる型の間で算術演算を行うと、自動的に double に昇格します。

n <- 1000000L

vec_int <- 1:n          # integer: 4 bytes each
vec_dbl <- as.double(1:n)  # double: 8 bytes each

cat('Integer vector size:', object.size(vec_int), 'bytes
')
cat('Double vector size: ', object.size(vec_dbl), 'bytes
')
cat('Ratio:', as.numeric(object.size(vec_dbl)) / as.numeric(object.size(vec_int)), '
')

is.integer() による整数格納形式の確認

整数の格納形式を正確に確認する必要がある場合は、is.numeric() ではなく、必ず is.integer() を使用してください。L サフィックスのない数値は、整数に見えても double です。

a <- 5    # looks like integer, but it is double
b <- 5L   # true integer

cat('is.integer(5):  ', is.integer(a), '
')   # FALSE!
cat('is.integer(5L): ', is.integer(b), '
')   # TRUE
cat('is.numeric(5):  ', is.numeric(a), '
')   # TRUE
cat('is.numeric(5L): ', is.numeric(b), '
')   # TRUE
cat('class(5):       ', class(a), '
')        # numeric
cat('class(5L):      ', class(b), '
')        # integer

変換ワークフローの例

実践的なワークフローは、double(デフォルト)としてデータを読み込み、計算を行い、その後、整数が必要な結果(個数、インデックス、ID など)を明示的に integer に変換することです。

# Simulated: reading counts as doubles (common from CSV)
counts_raw <- c(12.0, 8.0, 15.0, 3.0, 22.0)
cat('typeof raw:', typeof(counts_raw), '
')  # double

# Convert to integer for proper storage
counts_int <- as.integer(counts_raw)
cat('typeof converted:', typeof(counts_int), '
')  # integer
cat('Counts:', counts_int, '
')
cat('Total:', sum(counts_int), '
')

数値変換のまとめ

数値型で使用する主な変換関数は次のとおりです。

  • as.integer(x) — 整数に切り捨てる(小数を取り除き、0 の方向に近づける)
  • as.double(x) / as.numeric(x) — double に変換する
  • round(x) — 最も近い値に丸める(整数に近い値に使用)
  • floor(x) / ceiling(x) — 切り下げる / 切り上げる
  • 5L 構文 — 整数リテラル(変換不要)
  • 1:n — 常に整数を生成する
x <- 7.8
cat('as.integer(7.8):', as.integer(x), '
')  # 7 (truncate)
cat('round(7.8):     ', round(x), '
')       # 8
cat('floor(7.8):     ', floor(x), '
')       # 7
cat('ceiling(7.8):   ', ceiling(x), '
')     # 8

理解度チェック

R で as.integer(3.9) は何を返しますか?

復習: 数値型の変換

すばらしいです!このレッスンの重要なポイントは次のとおりです。

  • R には 2 つの数値型があります。integer(L サフィックス、4 バイト)と double(デフォルト、8 バイト)です
  • as.integer(x) は 0 の方向に切り捨てます。丸めではありません
  • as.double() と as.numeric() は同一で、double に変換します
  • / は整数オペランドに対しても常に double を返します
  • 1:n は整数の数列を作成し、L のない数値リテラルは double です
  • 約 21 億で整数オーバーフローが発生するため、非常に大きな整数には double を使用します
# Demonstrate truncation vs rounding
test_vals <- c(0.1, 0.5, 0.9, 1.5, 2.5, 3.7)
cat('Values:      ', test_vals, '
')
cat('as.integer(): ', as.integer(test_vals), '
')  # truncation
cat('round():      ', round(test_vals), '
')       # nearest (banker)

よくある質問

「数値型間の変換」レッスンは無料ですか?

はい。「数値型間の変換」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「数値型間の変換」で何を学びますか?

as.integer()、as.double()、as.numeric()を安全に使います。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「数値型間の変換」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Rの型システム概説
  2. 数値型間の変換
  3. 論理型と文字型の変換
  4. 強制変換の落とし穴とベストプラクティス
← R Academyに戻る