2016-07-26 25 views
1

Ich habe eine Datei mit mehreren Spalten. Ich zeige zwei Spalten, in denen ich interessiert zwei Spalten amgsub in Spalten Wert im Datenrahmen

Probe.Set.ID   Entrez.Gene 
A01157cds_s_at    50682 
A03913cds_s_at    29366 
A04674cds_s_at 24860 /// 100909612 
A07543cds_s_at    24867 
A09811cds_s_at    25662 
----       ---- 
A16585cds_s_at    25616 

ich ersetzen müssen /// mit "\ t" (tab) und dem Ausgang wie

A01157cds_s_at;50682 
A03913cds_s_at;29366 
A04674cds_s_at;24860  100909612 

Auch sein sollte, ich müssen diejenigen, die mit vermeiden „---“

+0

Wenn Sie '///' durch eine Registerkarte ersetzen, haben Sie einige Zeilen mit mehr Spalten als andere, die nicht gut importiert werden. Wie es aussieht, würde ich es mit 'read.fwf' importieren und nachher korrigieren. – alistaire

+0

Mit welchem ​​Teil kämpfen Sie? Aus dem Aussehen kann dies als feste Breite Daten gelesen werden help (read.fwf) ', Sie haben bereits' gsub' für die Ersetzung der Teiler gefunden und anscheinend können Sie diese Daten schreiben mit 'write.csv2'. Welchen Teil brauchst du Hilfe? Übrigens: 'Vermögen (230)' – Bernhard

Antwort

3

Hier wird etwas anderen Ansatz dplyr:

data <- data.frame(Probe.Set.ID = c("A01157cds_s_at", 
           "A03913cds_s_at", 
           "A04674cds_s_at", 
           "A07543cds_s_at", 
           "A09811cds_s_at", 
           "----", 
           "A16585cds_s_at"), 
       Entrez.Gene = c("50682", 
           "29366", 
           "24860 /// 100909612", 
           "24867", 
           "25662", 
           "----", 
           "25616") 
) 

if(!require(dplyr)) install.packages("dplyr") 
library(dplyr) 

data %>% 
    filter(Entrez.Gene != "----") %>% 
    mutate(new_column = paste(Probe.Set.ID, 
         gsub("///", "\t", Entrez.Gene), 
         sep = ";" 
         ) 
    ) %>% select(new_column) 
2

Sieht aus wie Sie die Daten der Teilmenge, dann fügen Sie die beiden Säulen zusammen, dann verwenden gsub machen die ersetzen die ‚///‘ wollen. Hier ist, was ich gefunden habe, wobei dat der Datenrahmen ist, der die zwei Spalten enthält.

dat = dat[dat$Probe.Set.ID != "----",] # removes the rows with "---" 
dat = paste0(dat$Probe.Set.ID, ";", dat$Entrez.Gene) # pastes the columns together and adds the ";" 
dat = gsub("///","\t",dat) # replaces the "///" with a tab 

Verwenden Sie auch cat(), um die Registerkarte im Gegensatz zu "\ t" anzuzeigen. Ich habe das von hier: How to replace specific characters of a string with tab in R. Dies wird eine Liste im Gegensatz zu einem dat.frame ausgeben. Sie können mit data.frame() zurück konvertieren, aber Sie können cat() nicht zum Anzeigen verwenden.

1

Wir dplyr und tidyr hier nutzen können.

library(dplyr) 
library(tidyr) 

> df <- data.frame(
    col1 = c('A01157cds_s_at', 'A03913cds_s_at', 'A04674cds_s_at', 'A07543cds_s_at', '----'), 
    col2 = c('50682', '29366', '24860 /// 100909612', '24867', '----')) 


> df %>% filter(col1 != '----') %>% 
    separate(col2, c('col2_first', 'col2_second'), '///', remove = T) %>% 
    unite(col1_new, c(col1, col2_first), sep = ';', remove = T) 

> df 

##    col1_new col2_second 
## 1 A01157cds_s_at;50682  <NA> 
## 2 A03913cds_s_at;29366  <NA> 
## 3 A04674cds_s_at;24860 100909612 
## 4 A07543cds_s_at;24867  <NA> 
  • filter entfernt die Beobachtungen mit col1 == '----'.
  • separatecol2 in zwei Säulen aufteilt, nämlich col2_first und col2_second
  • unite konkateniert col1 und col2_first mit ; als Separator.