teratail header banner
teratail header banner
質問するログイン新規登録
RStudio

RStudioは、Rのプログラミングを効率化する統合開発環境です。統計計算とグラフィックスができるプログラミング言語であるRのIDEでOSSで公開されています。ソースコードやコンソールなどが一つの画面に見やすく配置されている点が特徴。コマンド名以外に、関数名やパッケージ名も補完できます。

Q&A

解決済

2回答

929閲覧

R:列ごとに異なる対応表を用いて値を変換する

mammalian

総合スコア16

RStudio

RStudioは、Rのプログラミングを効率化する統合開発環境です。統計計算とグラフィックスができるプログラミング言語であるRのIDEでOSSで公開されています。ソースコードやコンソールなどが一つの画面に見やすく配置されている点が特徴。コマンド名以外に、関数名やパッケージ名も補完できます。

0グッド

0クリップ

投稿2022/02/02 18:32

0

0

このたびはお世話になります。

次のようなデータフレームがあります。

R

1 2study <- data.frame( 3 Employee_ID = c(101:110), 4 出身 = c("北海道","北海道", "東京", "大阪", "秋田", 5 "秋田", "東京", "大阪","北海道", "東京"), 6 性別= c(rep("男性",3), "女性", "男性", rep("女性", 2), 7 "男性","女性", "男性"), 8 好きな色 = c(rep("赤",2), rep("青",3), rep("黄",2), rep("緑",3)), 9 所属 = c("総務課", "経理課", "人事部", "経理課","総務課", 10 "経理課", "人事部", "経理課", "人事部", "経理課"), 11 異動= c(rep("YES",2), rep("NO",6), rep("YES",2)) 12)

これを、列ごとにそれぞれ異なる対応表を参照し、次のように数値に変換したく思います。

Employee_ID出身性別好きな色所属異動
101101
102101
103302
104412
105203
106213
107313
108404
109114
110304

変換に用いる対応表は次の通りで、データフレームの列番号に準拠した命名としています。
(v2 を、2列目(=出身)の変換に用いる)

R

1v2 <- data.frame( 2 出身 = c("北海道", "秋田", "東京", "大阪"), 3 code = c(1, 2, 3, 4) ) 4 5v3 <- data.frame( 6 性別 = c("男性", "女性"), 7 code = c(0, 1) ) 8 9v4 <- data.frame( 10 好きな色 = c("赤", "青", "黄", "緑"), 11 code = c(1,2,3,4) ) 12 13v5 <- data.frame( 14 所属 = c("経理課", "総務課", "人事部"), 15 code = c(1, 2, 3) ) 16 17V6 <- data.frame( 18 異動 = c("YES", "NO"), 19 code = c(1, 0) )

次のように、1列ずつは変換することができました。
しかし、実際のデータは列数が100列以上あります。
ループを使って処理したいのですが、V2, V3 ...と変数名も変化していくため、どうしても処理できません。すみませんが、お教えいただけましたら幸いです。

R

1pre <- study %>% select(2) 2post <-lapply(pre, function(x){ 3 as.vector(v2[[2]][match(x, v2[[1]])]) 4}) 5 6c <- data.frame( post) 7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

変換に用いる対応表の名前を paste で生成して、get でオブジェクト(dataframe)を取り出します。なお、質問にあるコードでは V6 となっていますが、v6 という名前で定義しています。

r

1for(v in 2:6){ 2 cnv <- get(paste0("v", v)) 3 col <- colnames(cnv)[1] 4 study[col] <- cnv$code[match(study[[col]], cnv[[col]])] 5} 6 7print(study)
Employee_ID出身性別好きな色所属異動
10110121
10210111
10330230
10441210
10520220
10621310
10731330
10840410
10911431
11030411

投稿2022/02/02 19:38

編集2022/02/02 19:58
melian

総合スコア21274

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mammalian

2022/02/03 00:43

遅い時間にもかかわらず、早速にご回答いただき、まことにありがとうございます。 (V6はご指摘の通り、v6とすべきでした。すみません。) 説明もつけて頂き、大変勉強になりました。ありがとうございます。
guest

0

vなんちゃらは一つのリストにまとめてしまえば、項目が何百あっても問題ないでしょう。

study <- data.frame( Employee_ID = c(101:110), 出身 = c("北海道","北海道", "東京", "大阪", "秋田", "秋田", "東京", "大阪","北海道", "東京"), 性別= c(rep("男性",3), "女性", "男性", rep("女性", 2), "男性","女性", "男性"), 好きな色 = c(rep("赤",2), rep("青",3), rep("黄",2), rep("緑",3)), 所属 = c("総務課", "経理課", "人事部", "経理課","総務課", "経理課", "人事部", "経理課", "人事部", "経理課"), 異動= c(rep("YES",2), rep("NO",6), rep("YES",2)) ) study2 <- study v <- list() v[[2]] <- data.frame( 出身 = c("北海道", "秋田", "東京", "大阪"), code = c(1, 2, 3, 4) ) v[[3]] <- data.frame( 性別 = c("男性", "女性"), code = c(0, 1) ) v[[4]] <- data.frame( 好きな色 = c("赤", "青", "黄", "緑"), code = c(1,2,3,4) ) v[[5]] <- data.frame( 所属 = c("経理課", "総務課", "人事部"), code = c(1, 2, 3) ) v[[6]] <- data.frame( 異動 = c("YES", "NO"), code = c(1, 0) ) for(i in 2:ncol(study)){ y <- sapply(1:nrow(study), function(xx){v[[i]][ v[[i]][,1]==study[xx,i], 2]}) study2[,i] <- y }

投稿2022/02/03 00:10

KojiDoi

総合スコア13727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mammalian

2022/02/03 01:34

リストにまとめてしまっても良いのですね、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問