質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.37%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

2回答

3066閲覧

2つのcsvファイルをidで対応させてmergeさせたい

monaa

総合スコア11

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

0クリップ

投稿2020/04/21 02:57

編集2020/04/21 02:59

前提・実現したいこと

2つのcsvファイルをidで対応させ、結合させたい

R, Rstudioを使い始めて1週間の初心者です。
id=1,2,3...で対応する2種類のcsvファイルを結合させたいと思っています。
それぞれのcsvファイルには異なる変数名が横に並んでいる形式です。
欠損値もあります(all =Tで対応)。
id(=人数)は片方のデータで1行(1ケース)多い状態です。

demo1 <-read.table(file = "data1.csv",

  • header = TRUE)

demo2 <-read.table(file = "data2.csv",

  • header = TRUE)

demomerged <-merge(demo1, demo2, by="id",

  • all = T)

発生している問題・エラーメッセージ

fix.by(by.x, x) でエラー: 'by' は有効な列を指定しなければなりません

該当のソースコード

ソースコード merge left_join

試したこと

・様々無料Rサイト・R書籍にて確認、書籍中に書いてあるコードそのものを入力しているが、走らないので、原因と改善策を知りたい
・単純にmerge で試しているが、サイトによるとdplyrで使えるleft_joinの方が高速であるとある。なんか難しそうで、mergeで解決してから…と試行錯誤中

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

shimiken

2020/04/21 06:03

head(demo1) head(demo2) の結果を教えてください。
monaa

2020/04/21 06:32 編集

ご質問ありがとうございます! 以下、コンソール画面に表示された結果を貼付けます。 どうぞご確認よろしくお願いいたします。 > head(demo1) id.sex.age.hight.weight.DB.connection.license 1 1,m,45,170,81,t,t,l 2 2,f,50,160,55,n,t,s 3 3,f,43,158,61,n,n,s 4 4,m,39,180,86,n,t,l 5 5,m,51,178,95,t,t,l 6 6,f,49,149,54,n,t,l > head(demo2) id.marital.economic.電子 1 1,s,,t 2 2,m,350,n 3 3,m,600,t 4 4,s,900,t 5 5,s,,t 6 6,s,600,t *実際の画面上では、例えばdemo1ではDBの下部の場所あたりから1,m,45, ...が記述される現れ方になっています。
shimiken

2020/04/21 06:35

カラム名の部分のピリオドはカンマの間違いですか?
monaa

2020/04/21 06:37

ご確認ありがとうございます。 カラム id.sex.age.hight.weight.DB.connection.license こちらはエクセルで作成したdemo1の表を「csv形式にして保存」、それをRに読み込ませたところ、確かにピリオドにて現れています。
shimiken

2020/04/21 06:44

demo1$id としたらどうなりますか?
monaa

2020/04/21 06:47

ご連絡ありがとうございます。以下の結果となりました。 > demo1$id [1] 1,m,45,170,81,t,t,l 2,f,50,160,55,n,t,s [3] 3,f,43,158,61,n,n,s 4,m,39,180,86,n,t,l [5] 5,m,51,178,95,t,t,l 6,f,49,149,54,n,t,l [7] 7,m,44,166,67,n,n,l 8,f,53,161,42,n,n,s [9] 9,f,33,172,60,t,t,s 10,m,37,178,59,n,t,l 10 Levels: 1,m,45,170,81,t,t,l ...
guest

回答2

0

それぞれのcsvファイルの先頭行の.を全文,に置き換えてください。エクセルからの変換でどうやればこんなことになるのか謎ですが、明らかに間違った変換が行われています。

質問にあるようなread.tableの使い方では正しくcsvファイルを読み込めません。read.tableのデフォルトの区切り文字はカンマではなく「ホワイトスペース」です。

demo1 <- read.table("data1.csv", header=T, sep=",") あるいは demo1 <- read.csv("data1.csv", header=T)

投稿2020/04/21 07:11

KojiDoi

総合スコア13692

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

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

monaa

2020/04/21 07:37

ご連絡ありがとうございます。 もう一度元のエクセルデータに戻り、ファイル形式を変更してみました。 これまでは、「CSV UTF-8(コンマ区切り)」で選択していましたが、「CSV(コンマ区切り)」に変更して保存し、 教えていただいた上記のコマンドの入力で、コンソール画面に綺麗なデータフレームが表示がされました!どうもありがとうございます。 また質問投稿の際には、アドバイスお願いできると幸いです。 どうぞよろしくお願いします。
monaa

2020/04/21 07:48

>read.tableのデフォルトの区切り文字はカンマではなく「ホワイトスペース」です。 こちらについても今ちゃんと理解しました。 重要なご指摘ありがとうございます!
guest

0

ベストアンサー

R

1demo1 <-read.table(file = "data1.csv", header = TRUE) 2demo2 <-read.table(file = "data2.csv", header = TRUE) 3 4colnames(demo1)<- c("id","sex","age","hight","weight","DB","connection","license") 5colnames(demo2)<- c("id","marital","economic","電子") 6 7demomerged <-merge(demo1, demo2, by="id", all = T)

これでどうでしょう

投稿2020/04/21 06:57

shimiken

総合スコア368

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

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

monaa

2020/04/21 07:02

ご回答ありがとうございます。 やってみたところ、以下エラーが出現しました。 colnamesとして全ての変数をベクトルとして()内に記述する作業を挟む必要があることが知れてひとつ賢くなりました。 > demo1 <-read.table(file = "data1.csv", header = TRUE) > demo2 <-read.table(file = "data2.csv", header = TRUE) > > colnames(demo1)<- c("id","sex","age","hight","weight","DB","connection","license") names(x) <- value でエラー: 'names' 属性 [8] はベクトル [1] の長さと同じでなければなりません > colnames(demo2)<- c("id","marital","economic","電子") names(x) <- value でエラー: 'names' 属性 [4] はベクトル [1] の長さと同じでなければなりません > > demomerged <-merge(demo1, demo2, by="id", all = T) fix.by(by.x, x) でエラー: 'by' は有効な列を指定しなければなりません
shimiken

2020/04/21 07:11

すみません。間違えました。
shimiken

2020/04/21 07:13

read.table を read.csv に変えてください。 colnames(demo1)<- c("id","sex","age","hight","weight","DB","connection","license") とかはしなくていいです。
monaa

2020/04/21 07:45

度々のアドバイスありがとうございます。 上述のコマンドを改めて入力したところ、csvファイルの連結に成功しました。 ただ日本語の変数名「電子」列が読み込めず、またエラーとなってしまったため、「elec」に変更したところ読み込めました。(これはまだ別の問題として調べていきます・・・) お二人の回答者さまのおかげで、無事解決できました。 決定的なコマンドを列挙いただいたので、回答者さまをベストアンサーにさせて頂きました。 また質問投稿の際には、アドバイスお願いできると幸いです。 どうぞよろしくお願いします。 <成功したコマンド> demo1 <- read.table("data1.csv", header=T, sep=",") demo1 demo2 <- read.table("data2.csv", header=T, sep=",") demo2 colnames(demo1)<- c("id","sex","age","hight","weight","DB","connection","license") colnames(demo2)<- c("id","marital","economic","elec") demomerged <-merge(demo1, demo2, by="id", all = T) demomerged
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問