2017-07-29 8 views
1

まず、2つの別々のテキストソースのフィーチャのマトリックスとフィーチャのdata.frameがある。それぞれについて、私は異なるテキストマイニング方法を実行しました。今、私はそれらを結合したいが、私はそれらのいくつかは、次のように同じ名前の列を持って知っている:R - 同じ名前のカラムを結合するが、いくつかのデータ値は0に等しい

> dtm.matrix[1:10,66:70] 
     cough nasal sputum yellow intermitt 
    1  1  0  0  0   0 
    2  1  0  0  0   0 
    3  0  0  0  0   0 
    4  0  0  0  0   0 
    5  0  0  0  0   0 
    6  1  0  0  0   0 
    7  0  0  0  0   0 
    8  0  0  0  0   0 
    9  0  0  0  0   0 
    10  0  0  0  0   0 

> dim(dtm.matrix) [1] 14300 6543

そして、第2のセットは次のようになります。

> data1.sub[1:10,c(1,37:40)] 
    Data number cough coughing up blood dehydration dental abscess 
1   1  0     0   0    0 
2   3  1     0   0    0 
3   6  0     0   0    0 
4   8  0     0   0    0 
5   9  0     0   0    0 
6   11  1     0   0    0 
7   12  0     0   0    0 
8   13  0     0   0    0 
9   15  0     0   0    0 
10   16  1     0   0    0 
> dim(data1.sub) 
[1] 14300 168 

私はthis topicからこのコードを入手しましたが、私はRが新しく、まだ助けが必要です。

​​

このコードを実行すると、1x6667の行列が返され、2つのデータセットの "咳"(または他の列)が一緒にマージされません。よくわかりません。これがどのように機能するか教えてください。

+1

あなたが簡単に、シンプルマージあなたは残りのデータを保存しておきたいことを考えると、このような場合には、それぞれと呼ばれる「データ数」で共有列にこれらの2つのオブジェクトをマージしようとしているように思えます基本的なことは、両方のセット(マージされる)に複製されるすべての列をキーとして明示的に参照することです。そして、それが機能するためには、両方のセットのすべてのキーのすべてのデータが、他のセットの同じ列と行に一致する必要があります。おそらく、データフレームのように、両方を同じタイプのデータ構造に変換する必要があります。 – sconfluentus

+0

私は、同じ名前のないすべての列に対して、これらのオブジェクトをまとめてマージしようとしています。同じ名前の列の場合は、両方のオブジェクトのすべての= 1の値を保持しながら、両方の列を1つの列にマージします。これが明らかな場合は、動作するコードのサンプルを表示できますか? – Diana01

+2

ようこそStackOverflowへ!サイトポリシーの問題(さらには「r」タグ内でも)は、データがどのように表示されるかを示すだけでなく、最小限の、完全で検証可能な例(MCVE)を提供することをお奨めします。 'dput'や質問の組み込みデータセットを使うなど、再現可能なデータを提供してください。 http://stackoverflow.com/help/mcveおよびhttps://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

答えて

1

これを行うには多くの方法があります。塩基Rを用いて、data.tableまたはdplyr。選択肢はデータの量に依存し、非常に大きな行列(通常は自然言語処理と単語表現のバッグの場合)で作業する場合は、問題を解決するためにさまざまな方法で遊ぶ必要がありますより良い(=最も速い)ソリューションをプロファイルします。 dplyrであなたがしたいことをやりました。これは少し醜いですが、それは動作します。私はちょうど2つのデータフレームをマージし、両方のデータフレームに存在するそれらの変数のためにforサイクルを使用します。それらを合計します(variable.xとvariable.y)。再現性のためにカラム名を少し変更しましたが、影響はありません。それがあなたのために働くかどうかお知らせください。

df1 <- read.table(text = 
'  cough nasal sputum yellow intermitt 
1  1  0  0  0   0 
2  1  0  0  0   0 
3  0  0  0  0   0 
4  0  0  0  0   0 
5  0  0  0  0   0 
6  1  0  0  0   0 
7  0  0  0  0   0 
8  0  0  0  0   0 
9  0  0  0  0   0 
10  0  0  0  0   0') 

df2 <- read.table(text = 
' Data_number cough coughing_up_blood dehydration dental_abscess 
1   1  0     0   0    0 
2   3  1     0   0    0 
3   6  0     0   0    0 
4   8  0     0   0    0 
5   9  0     0   0    0 
6   11  1     0   0    0 
7   12  0     0   0    0 
8   13  0     0   0    0 
9   15  0     0   0    0 
10   16  1     0   0    0') 

# Check what variables are common 
common <- intersect(names(df1),names(df2)) 

# Set key IDs for data 
df1$ID <- seq(1,nrow(df1)) 
df2$ID <- seq(1,nrow(df2)) 

# Merge dataframes 
df <- merge(df1, df2,by = "ID") 

# Sum and clean common variables left in merged dataframe 
library(dplyr) 

for (variable in common){ 
    # Create a summed variable 
    df[[variable]] <- df %>% select(starts_with(paste0(variable,"."))) %>% rowSums() 
    # Delete columns with .x and .y suffixes 
    df <- df %>% select(-one_of(c(paste0(variable,".x"), paste0(variable,".y")))) 
} 

df 
    ID nasal sputum yellow intermitt Data_number coughing_up_blood dehydration dental_abscess cough 
1 1  0  0  0   0   1     0   0    0  1 
2 2  0  0  0   0   3     0   0    0  2 
3 3  0  0  0   0   6     0   0    0  0 
4 4  0  0  0   0   8     0   0    0  0 
5 5  0  0  0   0   9     0   0    0  0 
6 6  0  0  0   0   11     0   0    0  2 
7 7  0  0  0   0   12     0   0    0  0 
8 8  0  0  0   0   13     0   0    0  0 
9 9  0  0  0   0   15     0   0    0  0 
10 10  0  0  0   0   16     0   0    0  1 
関連する問題