アプリ版:「スタンプのみでお礼する」機能のリリースについて

普段はSQL serverを使用しているのですが、Rを使用する必要に迫られています。

年齢を含むデータから、階級別のダミー変数を作成したいと考えています。

元データ) ものすごく簡易化してます
 age
 55
 66
 15

変換したい形式)
 a0-17 a18-64 a65-
0   1  0
0   0  1
1   0  0
こういったダミー変数に変換したいです。

SQLであれば
select *
,case when age < 18 then 1 else 0 end as 'a18'
,case when age >= 18 and age < 65 then 1 else 0 end as 'a18-64'
,case when age >= 65 and then 1 else 0 end as 'a65-'
from data1

で作成できるのですが、これをRで作成するとなると、どういったスクリプトを書けばいいのかが分かりません。
(自分なりに調べたのですが、近いものがなかなかなく、、)

ご存じの方がいらっしゃいましたら、ご教授お願いします。

A 回答 (3件)

一例です。

入力は整数のみ、と考えています。
----------------------------

# ダミーデータ生成

x <- data.frame(age = sample(c(1:99), 20, replace = TRUE))
x

# クラス分け関数

f1 <- function(x) apply(x, 2, function(x)ifelse(x %in% c( 0:17), 1, 0))
f2 <- function(x) apply(x, 2, function(x)ifelse(x %in% c(18:64), 1, 0))
f3 <- function(x) apply(x, 2, function(x)ifelse(x %in% c(65:99), 1, 0))

# ワンホットエンコーディング

result <- data.frame(x, f1(x), f2(x), f3(x))
names(result) <- c("age", "a0~17", "a18~64", "a65~")
result

----------------------------
実行結果(このサイトは勝手にスペースを消すのでガタガタですが・・・)

age a0~17 a18~64 a65~
1 92 0 0 1
2 5 1 0 0
3 85 0 0 1
4 88 0 0 1
5 28 0 1 0
6 40 0 1 0
7 28 0 1 0
8 9 1 0 0
9 38 0 1 0
10 85 0 0 1
11 29 0 1 0
12 7 1 0 0
13 69 0 0 1
14 39 0 1 0
15 66 0 0 1
16 83 0 0 1
17 32 0 1 0
18 54 0 1 0
19 91 0 0 1
20 48 0 1 0
    • good
    • 1
この回答へのお礼

できました!!
細かいところまでありがとうございます。

お礼日時:2022/12/09 14:06

#2です。



------------の内側を、Rコンソールにコピペすれば、お試しができます。



もし、「ageが配列の一部」のときは、最初のデータ生成部分で、xに代入して下さい。

x <- data.frame(age = dat[, 5])

これは、データdatの5列目に年齢があるときの例です。



また、「元の値が不要」の時は、ワンホットエンコーディングの箇所で、

result <- data.frame(f1(x), f2(x), f3(x))
names(result) <- c("a0~17", "a18~64", "a65~")

のように、age関連を取り除いて下さい。



最後に、「元の配列にこの結果を戻す」ときは、resultはデータフレームですので、cbind()でくっつけることが可能です。
    • good
    • 0

(10) Rでスクリプトを書いて実行する - YouTube


    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!