0
votes

Comment soustraire une colonne sur les autres colonnes d'un cadre de données

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 xxx

et j'aimerais que ce soit xxx

la logique serait Premières 38 colonnes - première colonne

colonnes 39:77 - Colonne 39

et ainsi de suite.


4 commentaires

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?


4 Réponses :


0
votes

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]
}


1 commentaires

Vérifiez ma réponse et voyez si cela aide. Pour les boucles ne sont généralement pas les meilleurs cependant.



0
votes

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 


0 commentaires

0
votes

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


0 commentaires

0
votes

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)
)


0 commentaires