2015-05-06 7 views
9

मैं एक मेज है कि इस प्रकार दिखता है:आर: एक और तालिका से डेटा के साथ तालिका में कॉलम जोड़ें

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") 
) 

दे रही है:

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

मैं विवरण के साथ एक और टेबल है और एक जोड़ना चाहते हैं जीन के साथ कॉलम। उदाहरण के लिए तालिका 2 होगा:

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

देता है:

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

मैं "जीन" नाम तालिका 2 के लिए एक और स्तंभ है कि दोनों तालिकाओं से "वर्णन" से मेल खाता है और करने के लिए Table1 से जीन कहते हैं जोड़ना चाहते हैं मिलती है:

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

मैं 'Gene' के लिए' Toothpaste' के मूल्य पर एक अच्छा हंसी थी। –

उत्तर

8

आप "Table1" में 'वर्णन' कॉलम विभाजित है और 'लंबी' प्रारूप करने के लिए 'विस्तृत' से डाटासेट कन्वर्ट करने के लिए splitstackshape से cSplit की कोशिश कर सकते। आउटपुट data.table होगा। हम कुंजीपटल को 'Desc' (setkey) के रूप में सेट करने के लिए data.table विधियों का उपयोग कर सकते हैं, "तालिका 2" के साथ जुड़ें, और आखिरकार कॉलम को चुनकर या आउटपुट में आवश्यक कॉलम को हटा दें (:=) अवांछित कॉलम शून्य पर

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। धन्यवाद, मैं – akrun

+0

पोस्ट अपडेट करूंगा क्या इसे पुस्तकालय (डेटा.table) की भी आवश्यकता होगी? या यह पुस्तकालय (splitstackshape) द्वारा स्वचालित रूप से लोड हो गया है? – TARehman

+0

@TARehman यह स्वचालित रूप से लोड हो गया है – akrun

5

यहाँ आधार आर में एक विधि एक मध्यवर्ती जोड़ने तालिका का उपयोग करता है:

# 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 

अब हमेशा की तरह इससे जुड़े हों:

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

मानते हैं कि प्रत्येक स्ट्रिंग अद्वितीय है (यानी। कि फल एक से अधिक जीन के लिए प्रकट नहीं हो सकता है), आप इसे for लूप और grep का उपयोग करके काफी आसानी से कर सकते हैं। हालांकि यह एक विशाल डेटासेट पर धीमा हो सकता है।

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

हम एक नामित सूची या 2 वैक्टर में एक महत्वपूर्ण देखने प्राप्त कर सकते हैं (उदाहरण के लिए, 2 स्तंभ डेटा फ्रेम) हम %l% समारोह int वह * qdapTools ** पैकेज मैं बनाए रखने का उपयोग कर सकते हैं। सबसे पहले मैं strsplit फ़ंक्शन का उपयोग करके नामित सूची में अपना Table1$desc विभाजित करूंगा। वह बाहर की कुंजी है। हम Table2$Desc के माध्यम से लुकअप कर सकते हैं। यह * डेटा का उपयोग करता है।तालिका ** बैकएंड में पैकेज तो यह बहुत तेजी से है:

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 

यहाँ एक शुद्ध आधार वेक्टर देखने कि भी बहुत तेजी से होना चाहिए:

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

@ TylerRinker के जवाब के बाद, मैं Table1$Desc स्वरूपित था पहली स्ट्रिंग:

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

फिर data.table पर जाएँ:

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

फिर विलय-एन-परिभाषित:

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

यह ठीक है ** qdapTools ** में '% l%' है। –

+0

@TylerRinker ओह, जानना अच्छा है। कूल फ़ंक्शन, वह :) – Frank

संबंधित मुद्दे