2017-02-06 23 views
2

Я хотел бы построить два типа значений друг против друга (dupl и orig). Можно ли легко изменить следующий фрейм данныхв R, переформатируя «смешанный» кадр данных с использованием расплава и литья

record=c("r1","r1","r2","r3","r3") 
v1=rep(0,5) 
v2=c(0,0,1,0,0) 
v3=c(1,1,0,1,1) 
type=c("orig","dupl","orig","orig","dupl") 

df<-data.frame(record, v1, v2, v3, type) 
df 
    record v1 v2 v3 type 
1  r1 0 0 1 orig 
2  r1 0 0 1 dupl 
3  r2 0 1 0 orig 
4  r3 0 0 1 orig 
5  r3 0 0 1 dupl 

чтобы выглядеть следующим образом:

record v1.orig v2.orig v3.orig v1.dupl v2.dupl v3.dupl 
r1   0  0  1  0  0  1 
r2   0  1  0    
r3   0  0  0  0  0  0 

Дело в том, что я могу составить график vX.orig vs vX.dupl. Или есть лучший способ сделать это? Я смотрю на dcast(), но, похоже, не может получить то, что хочу, возможно, потому что мои данные только частично расплавлены (по типу?).

EDIT: вот что я пробовал:

df1<-melt(df,id="record") 
dcast(df1,record~value, margins=TRUE) 

ответ

3

вы могли бы сделать это следующим образом:

library(reshape2) 
melted <- melt(df, id.vars= c("record", "type")) 
dcast(melted, record ~ variable + type) 

    record v1_dupl v1_orig v2_dupl v2_orig v3_dupl v3_orig 
1  r1  0  0  0  0  1  1 
2  r2  NA  0  NA  1  NA  0 
3  r3  0  0  0  0  1  1 

или мой оригинальный ответ:

library(tidyverse) 
df %>% gather(vx, num, -record, -type) %>% 
    unite(type, vx, type) %>% 
    spread(type, num) 
+0

это может быть обобщена на столбцы, которые не начинаются с «V» ? ... в моем реальном сценарии я хочу, чтобы все мои столбцы (40) дублировались как «_dupl». – val

+0

уверен, что вы можете отрегулировать эту часть на другие термины 'dplyr :: select()', проверьте изменение для альтернативы, используя 'reshape2' – Nate

2

В базовой R , используя двойную перестановку. Это будет также соответствующим образом изменить любые v1v2stem1stem2 и т.д. переменных в группах:

ids <- c("record","type") 
tmp <- reshape(df, idvar=ids, direction="long", varying=setdiff(names(df), ids), sep="") 
reshape(transform(tmp, time=interaction(time,type), type=NULL), idvar="record", direction="wide") 

#   record v.1.orig v.1.dupl v.2.orig v.2.dupl v.3.orig v.3.dupl 
#r1.orig.1  r1  0  0  0  0  1  1 
#r2.orig.1  r2  0  NA  1  NA  0  NA 
#r3.orig.1  r3  0  0  0  0  1  1 
1

Вот еще один вариант использования recast от reshape2

library(reshape2) 
recast(df, record~variable + type) 
# record v1_dupl v1_orig v2_dupl v2_orig v3_dupl v3_orig 
#1  r1  0  0  0  0  1  1 
#2  r2  NA  0  NA  1  NA  0 
#3  r3  0  0  0  0  1  1 

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

  • Нет связанных вопросов^_^