2015-05-06 13 views
9

Ich habe eine Tabelle, die wie folgt aussieht:R: In Spalte zur Tabelle mit Daten aus einer anderen Tabelle

Table1 <- data.frame(
    "Random" = c("A", "B", "C"), 
    "Genes" = c("Apple", "Candy", "Toothpaste"), 
    "Extra" = c("Up", "", "Down"), 
    "Desc" = c("Healthy,Red,Fruit", "Sweet,Cavities,Sugar,Fruity", "Minty,Dentist") 
) 

geben:

Random  Genes Extra      Desc 
1  A  Apple Up   Healthy,Red,Fruit 
2  B  Candy  Sweet,Cavities,Sugar,Fruity 
3  C Toothpaste Down    Minty,Dentist 

Ich habe eine andere Tabelle ein mit Beschreibung und möge hinzufügen Spalten mit Genen. Zum Beispiel Table2 wäre:

Table2 <- data.frame(
    "Col1" = c(1, 2, 3, 4, 5, 6), 
    "Desc" = c("Sweet", "Sugar", "Dentist", "Red", "Fruit", "Fruity") 
) 

Giving:

Col1 Desc 
1 1 Sweet 
2 2 Sugar 
3 3 Dentist 
4 4  Red 
5 5 Fruit 
6 6 Fruity 

Ich möchte eine andere Spalte zu Table2 namens „Gene“ hinzufügen, die den „Desc“ aus beiden Tabellen übereinstimmt und fügen die Gene aus Tabelle 1 zu erhalten:

Col1 Desc Gene 
1 1 Sweet Candy 
2 2 Sugar Candy 
3 3 Dentist Toothpaste 
4 4  Red Apple 
5 5 Fruit Apple 
6 6 Fruity Candy 
+2

Ich hatte ein gutes Lachen auf dem Wert von 'Toothpaste' für' Gene'. –

Antwort

8

Sie cSplit von splitstackshape könnten versuchen, die ‚Desc‘ Spalte in „Tabelle 1“ und wandeln den Datensatz von ‚breit‘ auf ‚long‘ Format zu spalten. Die Ausgabe wird data.table sein. Wir können die Methoden data.table verwenden, um die Schlüsselspalte als 'Desc' (setkey) festzulegen, mit "Table2" zu verbinden und schließlich die Spalten zu entfernen, die nicht in der Ausgabe benötigt werden, indem die Spalten ausgewählt oder (:=) die unerwünschten Spalten zugewiesen werden auf NULL

library(splitstackshape) 
setkey(cSplit(Table1, 'Desc', ',', 'long'),Desc)[Table2[2:1]][ 
        ,c(5,4,2), with=FALSE] 
# Col1 Desc  Genes 
#1: 1 Sweet  Candy 
#2: 2 Sugar  Candy 
#3: 3 Dentist Toothpaste 
#4: 4  Red  Apple 
#5: 5 Fruit  Apple 
#6: 6 Fruity  Candy 
+0

@AlexA. Danke, ich werde den Beitrag aktualisieren – akrun

+0

Würde dies auch Bibliothek (data.table) benötigen? Oder wird es automatisch von library (splitstapshape) geladen? – TARehman

+0

@TARehman Es wird automatisch geladen – akrun

5

hier ein Verfahren, das in Basis R ist, die eine Zwischenverknüpfungstabelle verwendet:

# create an intermediate data.frame with all the key (Desc)/value (Gene) pairs 
df <- NULL 
for(i in seq(nrow(Table1))) 
    df <- rbind(df, 
        data.frame(Gene =Table1$Genes[i], 
          Desc =strsplit(as.character(Table1$Desc)[i],',')[[1]])) 
df 
#>   Gene  Desc 
#> 1  Apple Healthy 
#> 2  Apple  Red 
#> 3  Apple Fruit 
#> 4  Candy Sweet 
#> 5  Candy Cavities 
#> 6  Candy Sugar 
#> 7  Candy Fruity 
#> 8 Toothpaste Minty 
#> 9 Toothpaste Dentist 

nun in der üblichen Weise zu verknüpfen:

Table2$Gene <- df$Gene[match(Table2$Desc,df$Desc)] 
3

Angenommen, dass jede Zeichenfolge eindeutig ist (d. H. dass Fruit nicht für mehr als ein Gen erscheinen kann), können Sie dies relativ einfach mit einer for Schleife und grep tun. Bei einem großen Datensatz kann es jedoch langsam sein.

options(stringsAsFactors = FALSE) 
Table1 <- data.frame("Random" = c("A", "B", "C"), "Genes" = c("Apple", "Candy", "Toothpaste"), "Extra" = c("Up", "", "Down"), "Desc" = c("Healthy,Red,Fruit", "Sweet,Cavities,Sugar,Fruity", "Minty,Dentist")) 
Table2 <- data.frame("Col1" = c(1, 2, 3, 4, 5, 6), "Desc" = c("Sweet", "Sugar", "Dentist", "Red", "Fruit", "Fruity")) 

Table2$Gene <- NA 
for(x in 1:nrow(Table2)) { 

    Table2[x,"Gene"] <- Table1$Genes[grep(pattern = paste("\\b",Table2$Desc[x],"\\b",sep=""),x = Table1$Desc)] 
} 
Table2 

    Col1 Desc  Gene 
1 1 Sweet  Candy 
2 2 Sugar  Candy 
3 3 Dentist Toothpaste 
4 4  Red  Apple 
5 5 Fruit  Apple 
6 6 Fruity  Candy 
4

Wenn wir eine Schlüsselsuche in eine benannte Liste oder 2 Vektoren (zum Beispiel 2 Spaltendatenrahmen) erhalten können, können wir die %l% Funktion int verwenden er * qdapTools ** Paket I erhalten. Zuerst werde ich Ihre Table1$desc in eine benannte Liste unter Verwendung der strsplit Funktion aufteilen. Das ist Schlüssel. Das können wir über Table2$Desc nachschlagen. Dies verwendet die * Daten.Tabelle ** Paket im Backend so ist es ziemlich schnelle:

library(qdapTools) 

key <- setNames(strsplit(as.character(Table1[["Desc"]]), "\\s*,\\s*"), Table1[["Genes"]]) 

## $Apple 
## [1] "Healthy" "Red"  "Fruit" 
## 
## $Candy 
## [1] "Sweet" "Cavities" "Sugar" "Fruity" 
## 
## $Toothpaste 
## [1] "Minty" "Dentist" 

Table2[["Gene"]] <- Table2[["Desc"]] %l% key 

## Col1 Desc  Gene 
## 1 1 Sweet  Candy 
## 2 2 Sugar  Candy 
## 3 3 Dentist Toothpaste 
## 4 4  Red  Apple 
## 5 5 Fruit  Apple 
## 6 6 Fruity  Candy 

Hier ist ein reiner Basisvektor-Lookup, die auch ziemlich schnell sein sollten:

x <- strsplit(as.character(Table1[["Desc"]]), "\\s*,\\s*") 
key <- setNames(rep(Table1[["Genes"]], sapply(x, length)), unlist(x)) 
Table2[["Gene"]] <- key[match(Table2[["Desc"]], names(key))] 
3

Nach @ TylerRinker Antwort würde ich formatieren Sie die Table1$Desc erste string:

Table1a  <- with(Table1, 
        stack(setNames(sapply(as.character(Desc),strsplit,split=","),Genes))) 
names(Table1a) <- c("Desc","Genes") 

Dann auf data.table:

require(data.table) 
DT1 <- data.table(Table1a,key="Desc") 
DT2 <- data.table(Table2,key="Desc") 

Dann verschmelzen-n-Definition:

DT2[DT1,Gene:=Genes] 
# Col1 Desc  Gene 
# 1: 3 Dentist Toothpaste 
# 2: 5 Fruit  Apple 
# 3: 6 Fruity  Candy 
# 4: 4  Red  Apple 
# 5: 2 Sugar  Candy 
# 6: 1 Sweet  Candy 
+0

Genau das macht '% l%' in ** qdapTools **. –

+0

@TylerRinker Oh, gut zu wissen. Coole Funktion, das :) – Frank

Verwandte Themen