2017-07-29 1 views
1

Zunächst einmal habe ich eine Matrix von Features und eine data.frame von Features aus zwei separaten Textquellen. Bei jedem von diesen habe ich verschiedene Text-Mining-Methoden durchgeführt. Nun, ich möchte, dass sie kombinieren, aber ich weiß, einige von ihnen haben Spalten mit identischen Namen wie die folgenden:R - Zusammenführen/Kombinieren von Spalten mit demselben Namen, aber einige Datenwerte gleich Null

> 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

und der zweite Satz wie folgt aussieht:

> 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 

I habe diesen Code von this topic, aber ich bin neu in R und ich brauche noch etwas Hilfe damit:

`data1.sub.merged <- dcast.data.table(merge(
    ## melt the first data.frame and set the key as ID and variable 
    setkey(melt(as.data.table(data1.sub), id.vars = "Data number"), "Data number", variable), 
    ## melt the second data.frame 
    melt(as.data.table(dtm.matrix), id.vars = "Data number"), 
    ## you'll have 2 value columns... 
    all = TRUE)[, value := ifelse(
    ## ... combine them into 1 with ifelse 
    (value.x == 0), value.y, value.x)], 
    ## This is the reshaping formula 
    "Data number" ~ variable, value.var = "value")` 

Wenn ich diesen Code ausführen, wird eine Matrix von 1x6667 zurückgegeben und die "Hust" (oder eine andere Spalte) aus den beiden Datensätzen zusammen nicht zusammengeführt. Ich bin verwirrt. Könntest du mir helfen wie das funktioniert?

+1

es scheint, wie Sie versuchen einfach, diese beiden Objekte auf einer Spalte in jeder genannten „Datennummer“ shared zu fusionieren, wenn dies der Fall ist, da Sie den Rest Ihrer Daten, eine einfache Zusammenführung beibehalten möchten würde funktionieren, das Wesentliche ist, dass alle Spalten, die in beiden Sätzen dupliziert werden (um zusammengeführt zu werden) explizit als Schlüssel referenziert werden. Und damit das funktioniert, müssen alle Daten in allen Schlüsseln aus beiden Mengen mit den gleichen Spalten und Reihen in der anderen Menge übereinstimmen. Sie sollten sie wahrscheinlich beide in den gleichen Typ von Datenstruktur konvertieren, wie zum Beispiel einen Datenrahmen. – sconfluentus

+0

Ich werde diese Objekte für alle Spalten zusammenführen, die keinen identischen Namen haben. Für Spalten, die einen identischen Namen haben, möchte ich beide Spalten in eine Spalte zusammenführen, während alle = 1 Werte von beiden Objekten in ihnen bleiben. Wenn das klar ist, könnten Sie mir eine Beispielcode zeigen, der funktioniert? – Diana01

+2

Willkommen bei StackOverflow! Als eine Frage der Site-Richtlinie (und noch mehr innerhalb des "r" -Tags) bitten wir Sie, ein minimales, vollständiges, verifizierbares Beispiel (MCVE) bereitzustellen, anstatt uns lediglich zu zeigen, wie die Daten aussehen. Bitte stellen Sie reproduzierbare Daten zur Verfügung, z. B. mit "dput" oder mit einem eingebauten Datensatz in Ihrer Frage. Bitte sehen Sie http://StackOverflow.com/Help/Mcve und https://StackOverflow.com/Questions/5963269/How-to-Make-Agreat-R-reproducible-Beispiel –

Antwort

1

Es gibt viele Möglichkeiten, das zu tun, z. unter Verwendung von Base R, data.table oder dplyr. Die Auswahl hängt von der Menge Ihrer Daten ab, und wenn Sie, sagen wir, mit sehr großen Matrizen arbeiten (was normalerweise bei der Verarbeitung natürlicher Sprache und der Darstellung von Wörtern der Fall ist), müssen Sie möglicherweise mit verschiedenen Möglichkeiten zur Lösung Ihres Problems spielen und profiliere die bessere (= die schnellste) Lösung. Ich habe getan, was Sie wollten über dplyr. Das ist ein bisschen hässlich, aber es funktioniert. Ich füge nur zwei Datenrahmen zusammen, dann benutze for Zyklus für die Variablen, die in beiden Datenrahmen existieren: summiere sie (variable.x und variable.y) und dann lösche em. Beachten Sie, dass ich Ihre Spaltennamen für die Reproduzierbarkeit geändert habe, aber dies sollte keine Auswirkungen haben. Bitte lassen Sie mich wissen, ob das für Sie funktioniert.

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 
Verwandte Themen