J'ai une trame de données composée de 1000 rangées et 156 colonnes. J'essaie de soustraire la première colonne aux 38 prochaines colonnes, puis de soustraire la colonne 39 au 38 suivant, mais je ne trouve donc pas un moyen de le faire. Je n'utilise que NCDF4 et rien d'autre. Quelque chose comme ça et j'aimerais que ce soit p> la logique serait
Premières 38 colonnes - première colonne p> colonnes 39:77 - Colonne 39 p> et ainsi de suite. P> P>
4 Réponses :
résolu en faisant simplement
{ z[,1:38] <- z[,1:38]-z[,1] z[,39:77] <-z[,39:77]-z[,39] z[,78:118] <-z[,78:118]-z[,78] z[,119:156] <-z[,119:156]-z[,119] }
Vérifiez ma réponse et voyez si cela aide. Pour les boucles ne sont généralement pas les meilleurs cependant.
Voici une fonction définie par l'utilisateur: vous pouvez ajouter d'autres instructions comme vous le souhaitez.
user system elapsed 0.02 0.00 0.01
Vous pouvez également faire ce qui suit sans aucune boucle:
# sample data frame df <- data.frame(matrix(data = seq(1,316),ncol = 158)) # split the data frame into list of data frame having columns # 1 to 38, 39 to 77 and so on df <- split.default(df, gl(round(ncol(df)/38),k = 38)) # subtract the last column from each df <- do.call(cbind, lapply(df, function(f) f - f[,ncol(f)])) colnames(df) <- paste0('C', seq(1,158)) print(head(df)) C1 C2 C3 C4 C5 1 -74 -72 -70 -68 -66 2 -74 -72 -70 -68 -66
Vous devriez envisager d'utiliser Tidyverse code> pour résoudre ceci, charger un package dans R ne fait que peu à la hauteur de votre environnement et peut rendre votre vie beaucoup plus facile.
df <-
data.frame(
C1 = c(1, 3),
C2 = c(2, 3),
C3 = c(3, 6),
C4 = c(4, 5),
C38 = c(5, 7),
C39 = c(1, 3),
C40 = c(2, 3),
C41 = c(3, 6),
C42 = c(4, 5),
C77 = c(5, 7)
)
Quelle est la logique derrière cette soustraction?
38 premières colonnes - première colonne puis colonnes 39:77 - Colonne 39 et ainsi de suite
J'ai compris! Modifiez votre question pour rendre cela plus clair.
Pourquoi le deuxième bloc n'est-il pas compris entre 39 et 76?