2017-08-18 2 views
0

Je voudrais insérer une dernière ligne dans une trame de données qui montrerait soit la somme des valeurs positives, soit la somme des valeurs positives la valeur négative par colonne, quelle que soit la somme ayant la plus grande amplitude.Ajouter une ligne à une image montrant l'amplitude (maximum de la somme des valeurs positives ou négatives)

La table finale ressemblerait à ceci avec la dernière ligne (« MaxAmplitude ») étant le résultat que je voudrais obtenir:

 
    c("A", "B", "C", "Max Amplitude") X1 X2 X3 X4 X5 
1         A -30 10 10 -2 8 
2         B 5 50 100 -10 -10 
3         C -10 -30 1 -1 3 
4      Max Amplitude -40 60 111 -13 11 

Mon idée était une approche à plusieurs étapes, où je successivement ajouter plusieurs lignes:

  • 1er rang faisant la somme des valeurs positives
  • 2e rangée faisant la somme des valeurs négatives
  • 3e rangée faisant les tes t de celui de la rangée 1 ou 2 a la plus grande amplitude en comparant la valeur absolue des deux sommes.

Mon problème est que je voudrais le faire sans avoir à ajouter autant de lignes à l'image. En outre, je ne sais pas comment faire pour afficher le signe négatif dans le cas où la somme des valeurs négatives a la plus grande amplitude (je perdrais cette information si je compare la valeur absolue).

Quelqu'un aurait-il une solution à la question de savoir comment coder cela? Merci beaucoup pour votre aide!

df <- cbind(c("A","B","C"),data.frame(matrix(c(-30,5,-10, 
                 10,50,-40, 
                 10,100,1, 
                 -2,-10,-1, 
                 8,-10,3 
                 ), nrow = 3, ncol = 5))) 

Répondre

2

Est-ce ce que vous voulez? En outre, apply retourner un matrix pas data.frame

apply(df[,2:6],2,function(x) sum(x[which((x>0)==(sum(x)>0))])) 


X1 X2 X3 X4 X5 
-40 60 111 -13 11 

Juste df[nrow(df)+1,]=c('Max Amplitude',c(apply(df[,2:6],2,function(x) sum(x[which((x>0)==(sum(x)>0))]))))

> df 
    c("A", "B", "C") X1 X2 X3 X4 X5 
1    A -30 10 10 -2 8 
2    B 5 50 100 -10 -10 
3    C -10 -40 1 -1 3 
4 Max Amplitude -40 60 111 -13 11 
+0

Un grand merci Wen, c'est exactement ce que je voulais mais je dois admettre que je ne l'ai pas bien comprendre comment le code a obtenu le bon résultat . En particulier, je ne suis pas sûr de comprendre la logique derrière: somme (x [qui ((x> 0) == (somme (x)> 0))]). – user8453031

+0

@ Had57 est la somme (x)> 0 qui signifie positif est plus grand que négatif, puis base sur votre explication, vous devez choisir le nombre positif et les résumer ensemble, est-ce clair? – Wen