Elimde bir dize listesi olduğunu varsayalım: string = c("G1:E001", "G2:E002", "G3:E003")
. Şimdi sadece ":" iki nokta üst üste işaretinden sonraki kısımları içeren bir dize vektörü elde etmeyi umuyorum, yani substring = c(E001,E002,E003)
. R'de bunu yapmanın uygun bir yolu var mı? Substr` kullanarak mı? Teşekkürler!
İşte birkaç yol:
1) alt
sub(".*:", "", string)
## [1] "E001" "E002" "E003"
2) strsplit
sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"
3) read.table
read.table(text = string, sep = ":", as.is = TRUE)$V2
## [1] "E001" "E002" "E003"
4) alt dize
Bu, ikinci kısmın her zaman 4. karakterden başladığını varsayar (sorudaki örnekte durum böyledir):
substring(string, 4)
## [1] "E001" "E002" "E003"
4a) substring/regex
Eğer iki nokta üst üste her zaman bilinen bir konumda olmasaydı, (4)'ü onu arayarak değiştirebilirdik:
substring(string, regexpr(":", string) + 1)
5) strapplyc
strapplyc` parantez içine alınmış kısmı döndürür:
library(gsubfn)
strapplyc(string, ":(.*)", simplify = TRUE)
## [1] "E001" "E002" "E003"
6) read.dcf
Bu yalnızca iki nokta üst üste işaretinden önceki alt dizeler benzersizse çalışır (sorudaki örnekte öyledir). Ayrıca ayırıcının iki nokta üst üste olmasını gerektirir (soruda olduğu gibi). Eğer farklı bir ayırıcı kullanılsaydı, o zaman sub
kullanarak önce iki nokta üst üste ile değiştirebilirdik. Örneğin, eğer ayırıcı _
olsaydı o zaman string <- sub("_", ":", string)
c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"
7) separate tidyr::separate
kullanarak, biri iki nokta üst üste işaretinden önceki, diğeri sonraki kısım için olmak üzere iki sütunlu bir veri çerçevesi oluştururuz ve ardından ikincisini çıkarırız.
library(dplyr)
library(tidyr)
library(purrr)
DF <- data.frame(string)
DF %>%
separate(string, into = c("pre", "post")) %>%
pull("post")
## [1] "E001" "E002" "E003"
7a) Alternatif olarak separate
sadece post
sütununu oluşturmak ve ardından ortaya çıkan veri çerçevesini unlist
ve unname
yapmak için kullanılabilir:
library(dplyr)
library(tidyr)
DF %>%
separate(string, into = c(NA, "post")) %>%
unlist %>%
unname
## [1] "E001" "E002" "E003"
EKLENDİ. strapplyc
, read.dcf
ve separate
çözümleri.
NOT.
Girdinin string
olduğu varsayılır:
string <- c("G1:E001", "G2:E002", "G3:E003")