2011-11-09 9 views
12

Tengo una trama de datos de esta manera:Añadir caracteres de una columna numérica en la trama de datos

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 

que quieren cambiar la columna de la V1 y añadir CHR antes del número. Justo como este:

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 

¿Hay alguna manera de hacer esto en R?

+0

'paste' (con especial atención al argumento' sep') –

Respuesta

17

El patrón regex "^" (fuera de cualquier paréntesis de clase de caracteres) representa el punto justo antes del primer carácter de un elemento "clase" de clase (también conocido como "cadena" en otros lenguajes de programación). Esto simplemente reemplaza el comienzo de cada elemento de "carácter" en el vector con una raíz de "chr". Coacciona implícitamente un valor de entrada "numérico" a "personaje", por lo que altera el modo del resultado.

> 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 

podría, por supuesto, han utilizado paste("chr", dat$V1, sep=""), pero pensé que una solución de expresiones regulares podría ser más ordenado.

+0

Gracias Dwin. ¡Esto funciona para mi! :) – Lisann

+3

¿Qué le dijo el martillo a la nuez? Te aplastaré en "pegar". – Andrie

5

sprintf es mucho más potente que la concatenación simple.

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

También podemos utilizar interaction:

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

O usando sqldf:?

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

¿Cómo uso la interacción en múltiples columnas? 'df [, 2: 3] <- interaction (df [2: 3]," addtext ", sep =" ")' arroja un error de clasificación – Vasim

Cuestiones relacionadas