Question

J'ai un data.frame data:

Sector Var1 Var2 Var3
Abcd    1    1    1
Efgh    4    5    6
Ijkl    7    8    9

Je voudrais créer un nouveau data.frame qui consiste en la différence entre chaque paire unique de Sector pour chaque variable.Un exemple du résultat souhaité est ci-dessous :

# result
Sector1 Sector2 Dif_Var1 Dif_Var2 Dif_Var3
Abcd    Efgh        3        4        5
Abcd    Ijkl        6        7        8
Efgh    Ijkl        3        3        3

Je peux trouver chaque paire unique (code ci-dessous) pour Sector mais je ne sais pas si c'est la façon de procéder.Ce pseudo-code minimal ci-dessous semble-t-il être une voie appropriée et potentiellement réussie ?

# pseudo code
result <- which(Sector1 == Sector) get Var1,2,3 values - which(Sector2 == Sector) get Var1,2,3 values

Existe-t-il une fonction ou un package r qui faciliterait l'obtention du résultat souhaité ?

# unique pairings
# http://stackoverflow.com/q/23024059/1670053
df <- structure(list(Sector = structure(1:3, .Label = c("Abcd", "Efgh", 
"Ijkl"), class = "factor"), Var1 = c(1L, 4L, 7L), Var2 = c(1L, 
5L, 8L), Var3 = c(1L, 6L, 9L)), .Names = c("Sector", "Var1", 
"Var2", "Var3"), class = "data.frame", row.names = c(NA, -3L))
df.u <- expand.grid(df$Sector,df$Sector)
df.u2 <- as.data.frame(unique(t(apply(df.u, 1, function(x) sort(x)))))
data <- subset(df.u2, ! df.u2$V1 == df.u2$V2)
Était-ce utile?

La solution

Utilisation du package sqldf :

library(sqldf)
sqldf("select A.Sector Sector1,
              B.Sector Sector2,
              B.Var1 - A.Var1 Var1, 
              B.Var2 - A.Var2 Var2, 
              B.Var3 - A.Var3 Var3
              from df A join df B
              on A.Sector < B.Sector")

donnant:

  Sector1 Sector2 Var1 Var2 Var3
1    Abcd    Efgh    3    4    5
2    Abcd    Ijkl    6    7    8
3    Efgh    Ijkl    3    3    3

Cela pourrait aussi s'écrire :

 nms <- names(df)[-1]
 sel <- toString( sprintf('B.%s - A.%s %s', nms, nms, nms) )
 fn$sqldf("select A.Sector Sector1, B.Sector Sector2, $sel 
           from df A join df B 
           on A.Sector < B.Sector")

MODIFIÉ Variation fixe et ajoutée.

Autres conseils

Vous pouvez simplement utiliser le V1 et V2 vecteurs que vous avez créés pour indexer df

df[data$V2, -1] - df[data$V1, -1]
#    Var1 Var2 Var3
#2      3    4    5
#3      6    7    8
#3.1    3    3    3

garder les noms

cbind(data$V1, data$V2, df[data$V2, -1] - df[data$V1, -1])
#    data$V1 data$V2 Var1 Var2 Var3
#2      Abcd    Efgh    3    4    5
#3      Abcd    Ijkl    6    7    8
#3.1    Efgh    Ijkl    3    3    3
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top