2016-11-24 3 views
0

У меня есть фрейм данных и вы хотите изменить его из широкого формата в длинный, но у меня есть три переменные, тогда как ref = RR_ref, het = RR_het и hom = RR_hom.R широкий и длинный формат с тремя переменными

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 

Кто-нибудь может мне помочь? Благодарю.

ответ

1

Мы можем использовать melt из data.table после изменения порядка столбцов

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

спасибо, но значение не является правильным в мэри Варс GG равно 1,0000, АГИ 0,29 и АА 0,0841 –

+0

@PeterChung Вы можете дайте немного больше подробностей о том, как сделать это долго. Является ли он основанным на символьных и числовых столбцах? – akrun

+0

Я хочу сделать его длинным для соответствия другому кадру данных, который заполнен такими Vars, как GG AA и AG, так что я могу сопоставить их с номером значения для вычисления. поэтому я думаю, что он основан на столбцах символов. –

Смежные вопросы