2013-06-07 7 views
1

J'ai une liste de paires de lettres dans df1. La dimension actuelle de df1 est de 1,5:Conversion d'un élément de trame de données en chaîne R

df1= AC,AD,AE,AF,AG 

Je veux ajouter une deuxième rangée de DF1 contenant les éléments inversés de df1 (dim: 2,5), à savoir:

df1= AC,AD,AE,AF,AG 
    CA,DA,EA,FA,GA 

I voulez accéder à la première ligne un élément à la fois, convertissez chaque en chaîne, puis inversez-le. J'ai essayé as.character(df1[1]) et toString(df1[1]) mais ils me donnent tous les deux "1" comme résultat. Est-ce que quelqu'un pourrait expliquer l'erreur et comment je pourrais la rectifier?

EDIT: La sortie pour str[df1] est:

'data.frame': 1 obs. of 5 variables: 
    $ V1 : Factor w/ 1 level "AC": 1 
    $ V2 : Factor w/ 1 level "AD": 1 
    $ V3 : Factor w/ 1 level "AE": 1 
    $ V4 : Factor w/ 1 level "AF": 1 
    $ V5 : Factor w/ 1 level "AG": 1 
+0

Pouvez-vous publier le résultat de 'str (df1)'? –

+0

Ce code R est syntaxiquement ** invalide **. S'il vous plaît fournir le code R réel de travail et des exemples s'il vous plaît. –

+0

Voir également 'strsplit', Crrl + F et recherchez' strReverse'. – A5C1D2H2I1M1N2O1R2T1

Répondre

3

Voici une façon de le faire avec des expressions régulières:

df1 <- read.csv(text = "AC,AD,AE,AF,AG", header = FALSE) # your data frame 

tmp <- sapply(df1, as.character) # a character vector 

matrix(c(tmp, sapply(df1, sub, pattern = "(.)(.)", replacement = "\\2\\1")), 
     2, byrow = TRUE) 

Le résultat:

 [,1] [,2] [,3] [,4] [,5] 
[1,] "AC" "AD" "AE" "AF" "AG" 
[2,] "CA" "DA" "EA" "FA" "GA" 

Le résultat est une matrice. Il peut être converti en un bloc de données avec as.data.frame.

1

généralement as.matrix est une bonne méthode de coercition.

df <- data.frame(matrix(c("AC","AD","AE","AF","AG"), nrow=1)) 
df 
X1 X2 X3 X4 X5 
1 AC AD AE AF AG 

sapply(df, function(x) paste(rev(strsplit(as.matrix(x), "")[[1]]), collapse="")) 
    X1 X2 X3 X4 X5 
"CA" "DA" "EA" "FA" "GA" 

répond-elle?

1

Je ne sais pas qui est la meilleure façon de le faire, mais ici est une approche qui fonctionne La première étape consiste à créer votre data.frame

dat <- Reduce(data.frame, 
       c("AC", "AD", "AE", "AF", "AG")) 
names(dat) <- paste0("V", 1:ncol(dat)) 
str(dat) 

## 'data.frame': 1 obs. of 5 variables: 
## $ V1: Factor w/ 1 level "AC": 1 
## $ V2: Factor w/ 1 level "AD": 1 
## $ V3: Factor w/ 1 level "AE": 1 
## $ V4: Factor w/ 1 level "AF": 1 
## $ V5: Factor w/ 1 level "AG": 1 

Et dans une dernière étape, nous allons créer une fonction pour inverser vecteur de chaîne et l'appliquer aux données

str_rev <- function(string) 
    paste(rev(unlist(strsplit(string, ""))), collapse = "") 

str_rev <- Vectorize(str_rev, USE.NAMES = FALSE) 


rbind(dat, 
     t(apply(dat, 1, str_rev)) 
    ) 

## V1 V2 V3 V4 V5 
## 1 AC AD AE AF AG 
## 2 CA DA EA FA GA 
Questions connexes