Saya memiliki kolom bingkai data yang memiliki ribuan nama sampel yang rumit seperti ini

sample- c("16_3_S16_R1_001", "16_3_S16_R2_001", "2_3_S2_R1_001","2_3_S2_R2_001")

Saya mencoba tanpa hasil untuk mengubah nama sampel untuk mencapai nama sampel berikut 16.3R1, 16.3R2, 2.3R1,2.3R2

Saya berpikir untuk menyelesaikan masalah dengan qsub atau stringsR. Ada saran? Saya telah mencoba qsub tetapi tidak mengambil nama yang diinginkan

1
LDT 8 Januari 2021, 14:40

3 jawaban

Jawaban Terbaik

Anda dapat menggunakan sub untuk mengekstrak bagian :

sample <- c("16_3_S16_R1_001","16_3_S16_R2_001","2_3_S2_R1_001","2_3_S2_R2_001")
sub('(\\d+)_(\\d+)_.*(R\\d+).*', '\\1.\\2\\3', sample)
#[1] "16.3R1" "16.3R2" "2.3R1"  "2.3R2" 

\\d+ mengacu pada satu atau lebih digit. Nilai yang ditangkap antara () disebut sebagai grup tangkap. Jadi di sini kita menangkap satu atau lebih digit (1), diikuti oleh garis bawah dan digit lain (2) dan akhirnya "R" dengan digit (3). Nilai yang ditangkap dirujuk menggunakan referensi balik sehingga \\1 adalah nilai pertama, \\2 sebagai nilai kedua dan seterusnya.

3
Ronak Shah 9 Januari 2021, 00:00

Jika Anda membagi sampel string menjadi substring sesuai dengan pola "_", Anda hanya perlu bagian 1, 2n, dan 4:

sample <- c("16_3_S16_R1_001", 
            "16_3_S16_R2_001",
            "2_3_S2_R1_001",
            "2_3_S2_R2_001")

x <- strsplit(sample, "_")

sapply(x, function(y) paste0(y[1], ".", y[2], y[4]))
3
lumartor 8 Januari 2021, 12:30

Inilah salah satu cara yang bisa Anda lakukan.

Ini membantu untuk membuat bingkai data dengan kolom header, jadi itulah yang saya lakukan di bawah, dan saya menyebut kolom "kucing"

trial <- data.frame( "cats" = character(0))
x <- c("16_3_S16_R1_001", "16_3_S16_R2_001", "2_3_S2_R1_001","2_3_S2_R2_001")
df <- data.frame("cats" = x)

Data harus dalam struktur yang benar, dalam kasus kami, as.factor()

df$cats <- as.factor(df$cats)
levels(df$cats)[levels(df$cats)=="16_3_S16_R1_001"] <- "16.3R1"
levels(df$cats)[levels(df$cats)=="16_3_S16_R2_001"] <- "16.3R2"
levels(df$cats)[levels(df$cats)=="2_3_S2_R1_001"] <- "2.3R1"
levels(df$cats)[levels(df$cats)=="2_3_S2_R2_001"] <- "2.3R2"

Dan voila

1
Andy 8 Januari 2021, 12:04