2011-11-09 31 views
12

Tôi có một dataframe như thế này:Thêm ký tự cho một cột số trong dataframe

V1  V2  V3 
1 1 3423086 3423685 
2 1 3467184 3467723 
3 1 4115236 4115672 
4 1 5202437 5203057 
5 2 7132558 7133089 
6 2 7448688 7449283 

Tôi muốn thay đổi cột V1 và thêm chr trước số. Chỉ cần như thế này:

V1  V2  V3 
1 chr1 3423086 3423685 
2 chr1 3467184 3467723 
3 chr1 4115236 4115672 
4 chr1 5202437 5203057 
5 chr2 7132558 7133089 
6 chr2 7448688 7449283 

Có cách nào để thực hiện việc này trong R không?

+0

'paste' (với sự quan tâm đặc biệt để' cái lập luận sep') –

Trả lời

17

Mẫu regex "^" (bên ngoài bất kỳ dấu ngoặc đơn nào) đại diện cho điểm ngay trước ký tự đầu tiên của một mục "ký tự" (còn gọi là "chuỗi" trong các ngôn ngữ máy tính khác). Điều này chỉ thay thế phần đầu của mỗi phần tử "ký tự" trong vectơ có thân "chr". Nó ngầm ép buộc một giá trị đầu vào "số" vào "ký tự" để làm thay đổi chế độ của kết quả.

> dat$V1 <- sub("^", "chr", dat$V1) 
> dat 
    V1  V2  V3 
1 chr1 3423086 3423685 
2 chr1 3467184 3467723 
3 chr1 4115236 4115672 
4 chr1 5202437 5203057 
5 chr2 7132558 7133089 
6 chr2 7448688 7449283 

Có thể, dĩ nhiên, đã sử dụng paste("chr", dat$V1, sep=""), nhưng tôi nghĩ rằng một giải pháp regex có thể được lặp lại.

+0

Cảm ơn bạn Dwin. Nó làm việc cho tôi! :) – Lisann

+3

Cái búa tạ nói gì với đai ốc? Tôi sẽ đập bạn thành 'paste'. – Andrie

5

sprintf mạnh hơn rất nhiều so với ghép nối đơn giản.

dat$V1 <- sprintf('chr%i', dat$V1) 
3

Chúng tôi cũng có thể sử dụng interaction:

df$V1 <- interaction("chr", df$V1, sep = "") 
df 

Hoặc sử dụng sqldf:

library(sqldf)  
df$V1 <- as.character(df$V1) 
df$V1 <- sqldf("select 'chr'|| V1 as V1 from df") 
+0

Làm cách nào để sử dụng tương tác trên nhiều cột? 'df [, 2: 3] <- tương tác (df [2: 3]," addtext ", sep =" ")' ném ra lỗi sắp xếp – Vasim

Các vấn đề liên quan