2017-01-20 1 views
1

Je voudrais faire une fonction qu'il calcule la différence entre plusieurs colonnes de R.différence entre les colonnes R

Par exemple, mon cadre de données ressemble à ce que:

id Value Value2 Value3 Value4 
A234  10  15  NA  NA 
B345  20  25  25  30 
C500  20  25  15  NA 

Je voudrais comme la fonction de prendre la différence entre la 5ème et la 4ème colonne. Ensuite, les 4ème et 3ème colonnes puis les 3ème et 2ème colonnes.

Je suis désolé, je suis novice dans R.


df <- structure(list(id = c("A234", "B345", "C500"), Value = c(10L, 
20L, 20L), Value2 = c(15L, 25L, 25L), Value3 = c(NA, 25L, 15L 
), Value4 = c(NA, 30L, NA)), .Names = c("id", "Value", "Value2", 
"Value3", "Value4"), class = "data.frame", row.names = c(NA, -3L)) 

Répondre

1

Supposons que votre trame de données est df, la première colonne étant "id", tandis que le reste des colonnes étant données que vous voulez prendre la différence, nous pouvons faire:

df0 <- df[-1] ## remove "id" column 
## df0[-1] - df0[-length(df0)] ## taking difference 
cbind(df[1], df0[-1] - df0[-length(df0)]) ## taking difference and combine 

# id Value2 Value3 Value4 
#1 A234  5  NA  NA 
#2 B345  5  0  5 
#3 C500  5 -10  NA 

Le nom de la colonne de ces nouvelles données le cadre hérite de celui de df0[-1].

+0

juste une petite variation; 'cbind (df [1], df [-1] -cbind (x = 0, df [c (-1, -5)]))' +1 –

0

n'a pas testé cela, mais, en supposant que votre data.frame est appelée df il pourrait être aussi simple que cbind(df$Value2-df$Value,df$Value3-df$Value2,df$Value4-df$Value3) Vous pourriez rap que dans une fonction très facilement.

+0

ok, et cela fonctionne pour chaque ligne? –

0

Je pense que pour répondre à vos besoins, la réponse de Zheyuan Li est la plus simple et la plus élégante. Cependant, je voulais juste montrer comment vous pourriez également résoudre cela en utilisant ma fonction goto pour les différences entre les valeurs, diff, du paquet Matrix. Dans ma réponse j'ai retenu la commande que vous avez demandée (col 5 - col4, col 4 - col 3, etc.).

# Load package 
library(Matrix)  

# Create a dataframe of differences 
cbind(df[1], rev(as.data.frame(t(apply(df[-1], 1, diff, 1))))) 
# id Value4 Value3 Value2 
#1 A234  NA  NA  5 
#2 B345  5  0  5 
#3 C500  NA -10  5