2017-07-20 3 views
0

Je pense que j'ai besoin d'écrire une boucle if/else pour accomplir cela, mais je ne sais pas par où commencer. Je souhaite rechercher dans une colonne de mon bloc de données des valeurs d'une certaine longueur et contenant un certain symbole. Par exemple, dans la colonne LAYER, si la valeur est longue de deux symboles et contient un «L» (cela peut être LF, FL, LH ou HL), je veux multiplier les autres valeurs de colonne par 0,5.R: Sélection et modification des valeurs dans la colonne du bloc de données

LAYER VALUE UPPER LOWER THICKNESS_MIN THICKNESS_MAX A1 A2 A3 

LF  5  0  4   3     10   3.4 67 24 
LFH  9  0  6   2     9   3.7 65 76 
FH  4  0  2   1     8   3.3 35 34 
FL  11  0  1   5     6   3.8 56 86 
LH  50  0  4   3     4   4.6 43 45 

Le format de phrase que j'ai pour cela est la « valeur #if dans la couche est de 2 caractères et l'un d'eux est L, il faut multiplier la valeur des colonnes, supérieur, inférieur, THICKNESS_MIN ET THICKNESS_MAX par 1/2 et changer la valeur LAYER à FF_FH pour cette ligne

Je dois aussi faire la même chose mais pour les lignes où la valeur de la couche est de 3 caractères, et les autres variables sont multipliées par 2/3.

Je veux que le résultat final d'être quelque chose comme

LAYER VALUE UPPER LOWER THICKNESS_MIN THICKNESS_MAX A1 A2 A3 

LF  2.5  0  2   1.5    5   3.4 67 24 
LFH  3  0  2   1.3    3   3.7 65 76 
FH  4  0  2   1     8   3.3 35 34 
FL  5.5  0  0.5   2.5    3   3.8 56 86 
LH  25  0  2   1.5    2   4.6 43 45 

Répondre

1

Tout d'abord, nous allons mettre votre ensemble de données sous une forme qui peut être copié et collé à une session R.

mydf <- 
structure(list(LAYER = c("LF", "LFH", "FH", "FL", "LH"), VALUE = c(5L, 
9L, 4L, 11L, 50L), UPPER = c(0L, 0L, 0L, 0L, 0L), LOWER = c(4L, 
6L, 2L, 1L, 4L), THICKNESS_MIN = c(3L, 2L, 1L, 5L, 3L), THICKNESS_MAX = c(10L, 
9L, 8L, 6L, 4L), A1 = c(3.4, 3.7, 3.3, 3.8, 4.6), A2 = c(67L, 
65L, 35L, 56L, 43L), A3 = c(24L, 76L, 34L, 86L, 45L)), .Names = c("LAYER", 
"VALUE", "UPPER", "LOWER", "THICKNESS_MIN", "THICKNESS_MAX", 
"A1", "A2", "A3"), class = "data.frame", row.names = c(NA, -5L 
)) 

Maintenant, il est très facile, rappelez-vous juste que grepl retourne un vecteur logique de la taille de son deuxième argument, donc nous pouvons et il (&) avec la sortie de nchar. Si le nombre de caractères dans la colonne d'intérêt est 3, adaptez simplement le code en conséquence.

inx <- nchar(mydf$LAYER) == 3 
mydf[inx, 2:5] <- mydf[inx, 2:5] * 2/3 

mydf 
    LAYER VALUE UPPER LOWER THICKNESS_MIN THICKNESS_MAX A1 A2 A3 
1 FF_FH 2.5  0 2.0  1.500000   10 3.4 67 24 
2 LFH 6.0  0 4.0  1.333333    9 3.7 65 76 
3 FH 4.0  0 2.0  1.000000    8 3.3 35 34 
4 FF_FH 5.5  0 0.5  2.500000    6 3.8 56 86 
5 FF_FH 25.0  0 2.0  1.500000    4 4.6 43 45