2016-06-16 7 views
2

Wie kann ich eine Spalte durch mehrere Trennzeichen in separaten Spalten in DatenrahmenWie teilt man Datenrahmen mit mehreren Trennzeichen mit str_split_fixed?

read.table(text = " Chr Nm1 Nm2 Nm3 
    chr10_100064111-100064134+Nfif 20 20 20 
    chr10_100064115-100064138-Kitl 30 19 40 
    chr10_100076865-100076888+Tert 60 440 18 
    chr10_100079974-100079997-Itg 50 11 23     
    chr10_100466221-100466244+Tmtc3 55 24 53", header = TRUE) 


       Chr    gene Nm1 Nm2 Nm3 
    chr10_100064111-100064134 Nfif 20 20 20 
    chr10_100064115-100064138 Kitl 30 19 40 
    chr10_100076865-100076888 Tert 60 440 18 
    chr10_100079974-100079997 Itg 50 11 23 12     
    chr10_100466221-100466244 Tmtc3 55 24 53 12 

i

library(stringr) 
df2 <- str_split_fixed(df1$name, "\\+", 2) 

verwendet getrennt spaltete würde ich gerne wissen, wie wir beide + und können sein - Begrenzer

+2

Verwenden Sie eine Regex Zeichenklasse in 'str_split 'mit' "[+ -]" 'oder benutze eine Pipe' + | -'. Außerdem bin ich mir nicht sicher, ob du hier etwas von 'stringr' gewinnst, das regulärer' strsplit' noch nicht gut macht. – alistaire

Antwort

3

Wenn Sie versuchen, eine Spalte in mehr aufgeteilt, tidyr::separate ist praktisch:

library(tidyr) 

dat %>% separate(Chr, into = paste0('Chr', 1:3), sep = '[+-]') 

#    Chr1  Chr2 Chr3 Nm1 Nm2 Nm3 
# 1 chr10_100064111 100064134 Nfif 20 20 20 
# 2 chr10_100064115 100064138 Kitl 30 19 40 
# 3 chr10_100076865 100076888 Tert 60 440 18 
# 4 chr10_100079974 100079997 Itg 50 11 23 
# 5 chr10_100466221 100466244 Tmtc3 55 24 53 
1

Dies sollte funktionieren:

str_split_fixed(a, "[-+]", 2) 
+1

Sie müssen 'str_split' (oder' strsplit') verwenden, wenn Sie regex verwenden, nicht 'str_split_fixed'. – alistaire

+0

Aus der str_split_fixed Dokumentation: "Die Standardinterpretation ist ein regulärer Ausdruck, wie in stringi-search-regex beschrieben. Steueroptionen mit regex()" Auch ich habe es getestet und scheint zu arbeiten –

+0

Hmm, Sie sind richtig! ... obwohl das eine sehr verwirrend benannte Menge von Funktionen ist, wenn man das Basis-R-Regex 'fixed = TRUE'-Verhalten hat. – alistaire

2

Hier ist ein Weg, dies in der Basis R zu tun mit strsplit:

# split Chr into a list 
tempList <- strsplit(as.character(df$Chr), split="[+-]") 

# replace Chr with desired values 
df$Chr <- sapply(tempList, function(i) paste(i[[1]], i[[2]], sep="-")) 

# get Gene variable 
df$gene <- sapply(tempList, "[[", 3) 
+0

wenn versucht df $ gen <- sapply (TempList, "[[", 3) Fehler in FUN (X [[i]], ...): Index außerhalb der Grenzen – beginner

+0

@beginner Ich habe nur kopiert und eingefügt Ihre Beispieldaten .frame, benennen Sie es df, und dann kopiert und eingefügt meine vorgeschlagene Lösung und erhielt diesen Fehler nicht. – lmo