2017-09-28 4 views
0

Je souhaite remplacer une chaîne (le numéro '2' dans mon exemple) dans une trame de données différemment en fonction du numéro de ligne. Ceci est mon entrée:Remplacer un nombre par caractère par apply en fonction de la ligne de trame de données

df <- "2 2 2 3 
     3 3 2 1" 
df <- read.table(text=df) 

Ce serait mon résultat attendu:

dfout <- "1R 1R 1R 3 
     3 3 2R 1" 
dfout <- read.table(text=df) 

Par conséquent, le chiffre « 2 » devrait être remplacé par « 1R » dans la première rangée, par « 2R » dans la deuxième rangée et ainsi de suite dans les grandes matrices (mes données réelles ont plus de 1000 lignes). J'ai essayé le code ci-dessous sans succès:

apply(g1x, 1, function(x) gsub("2", nrow(x), x)) 

Je serais heureux de toute aide ici.

+0

Dans mon exemple, j'ai deux lignes, pour la première ligne, je voudrais remplacer « 2 » par « 1R », dans la deuxième rangée remplacer « 2 » par ' 2R 'et ainsi de suite. J'ai mis à jour ma question pour plus de clarté. – user3091668

+0

@Sotos - bien sûr 'gsub' acceptera des fonctions si elles donnent la bonne valeur -' apply (df, 1, fonction (x) gsub ("2", longueur (x), x)) 'par exemple. – thelatemail

+0

@thelatemail, je pensais qu'ils devaient utiliser 'gsubfn' pour cela (pensait que c'était son but). Peut-être que je me suis précipité ... – Sotos

Répondre

0

En utilisant data.table

library(data.table) 

df <- "2 2 2 3 
     3 3 2 1" 
df <- data.table(read.table(text=df)) 

mycols <- names(df) 
df[, (mycols) := lapply(.SD, function(x) ifelse(x==2, paste0(df[,.I], "R"),x)), .SDcols = mycols] 
3

Voici une idée en utilisant sapply de la base R,

as.data.frame(t(sapply(seq(nrow(df)), function(i) 
             replace(df[i,], df[i,] == 2, paste0(i, 'R'))))) 

qui donne,

V1 V2 V3 V4 
1 1R 1R 1R 3 
2 3 3 2R 1 
4

Une variation sur la réponse @sotos:

replace(df, df==2, paste0(row(df)[df==2], "R") 

# V1 V2 V3 V4 
#1 1R 1R 1R 3 
#2 3 3 2R 1 

équivalent à la forme de remplacement:

df[df==2] <- paste0(row(df)[df==2], "R") 
+0

Nice! Je ne savais pas à propos de 'row' – Sotos

1

est ici comme méthode de base en utilisant R which avec l'argument arr.ind. Il est similaire dans l'esprit à la méthode de l'Amérique.

pos <- which(df == 2, arr.ind=TRUE) 
df[pos] <- paste0(pos[,1], "R") 

cette retourne

df 
    V1 V2 V3 V4 
1 1R 1R 1R 3 
2 3 3 2R 1