2016-11-24 4 views
0

J'ai un cadre de données et je veux le changer du format large au format long mais j'ai trois variables, alors que ref = RR_ref, het = RR_het et hom = RR_hom.R format large à long avec trois variables

df: 
Number ref het RR_het hom RR_hom RR_ref 
mary GG AG 0.29 AA 0.0841 1 
wayne AA AG 1.7  GG 2.89 1 

structure(list(Number = c("mary", "wayne"), ref = c("GG", "AA" 
), het = c("AG", "AG"), RR_het = c(0.29, 1.7), hom = c("AA", 
"GG"), RR_hom = c(0.0841, 2.89), RR_ref = c(1L, 1L)), .Names = c("Number", 
"ref", "het", "RR_het", "hom", "RR_hom", "RR_ref"), class = "data.frame", row.names = c(NA, -2L)) 

desired output: 
Name Vars Value 
mary GG  1 
wayne AA  1 
mary AG  0.29 
wayne AG  1.7 
mary AA  0.0841 
wayne GG  2.89 

Quelqu'un peut-il m'aider? Merci.

Répondre

1

Nous pouvons utiliser melt de data.table après avoir changé l'ordre des colonnes

library(data.table) 
library(gtools) 
melt(setDT(df[c(names(df)[1], mixedsort(names(df)[-1]))]), 
    measure = patterns("^[a-z]+$", "_"), 
    value.name = c("Vars", "Value"))[, variable := NULL][] 
# Number Vars Value 
#1: mary AG 0.2900 
#2: wayne AG 1.7000 
#3: mary AA 0.0841 
#4: wayne GG 2.8900 
#5: mary GG 1.0000 
#6: wayne AA 1.0000 
+0

merci, mais la valeur est correcte dans mary GG est égale Vars à 1.0000, AG est 0.29 et AA est 0,0841 –

+0

@PeterChung Pouvez-vous fournir un peu plus de description sur la façon de vouloir faire long. Est-ce basé sur le caractère et les colonnes numériques? – akrun

+0

Je veux faire long pour correspondre à une autre trame de données qui est pleine de Vars comme GG AA et AG, de sorte que je puisse les faire correspondre dans le numéro de valeur pour le calcul. donc je pense qu'il est basé sur les colonnes de caractères –