2016-03-31 26 views
0

I Girişi çoksadece tek bir üst üste neden verileri yeniden şekillendirme

gibi uzun/uzun biçiminde bir dataframe (DF) sahiptir:

ID entity_id type 
A1 1001  husband 
A1 1002  wife 
A1 1003  brother 
A1 1004  son 
A2 2005  husband 
A2 2006  son 

Bu geniş biçimde olmak isteyen Ben

yeniden şekillendirme çiftleri işleyemez Çünkü (varsayılan saymak) aşağıdaki Ben bir kukla sütun eklenmiştir yaptığımız

df$dummy <- seq_len(now(df)) 

df_wide <- dcast(df, dummy + ID ~ type, value.var="entity_id") 

Bu bende ne olduğunu:

dummy ID husband wife brother son 
1  A1 1001 NA NA  NA 
2  A1 NA  1002 NA  NA 
3  A1 NA  NA 1003 NA 

istediğim Ne:

dummy ID husband wife brother son 
1  A1 1001 1002 1003 1004 
2  A2 2005 NA NA  2006 

Edit1 SessionINFO()

R version 3.2.4 (2016-03-10) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 
Running under: OS X 10.11.3 (El Capitan) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] tidyr_0.4.1 reshape2_1.4.1 dplyr_0.4.3 RMySQL_0.10.8 DBI_0.3.1  

loaded via a namespace (and not attached): 
[1] plyr_1.8.3  magrittr_1.5 R6_2.1.2  assertthat_0.1 parallel_3.2.4 tools_3.2.4 Rcpp_0.12.4 stringi_1.0-1 stringr_1.0.0 

cevap

1

ben (eğer kukla sütun eklemek neden tamamen anlamıyorum eminim ve ben bunun için df_dummy yerine df$dummy yazmak istediğinizi varsayalım). Aşağıdaki (--- sana varsayarak öneririm, çoklu kardeş ve oğulları vardır ki gözden geçirilmiş verileri ile:

library(reshape2) 

df <- read.delim(text="ID entity_id type 
       A1 1001  husband 
       A1 1002  wife 
       A1 1003  brother 
       A1 1004  son 
       A2 2005  husband 
       A2 2006  son", sep="") 

dcast(df, ID ~ type, value.var="entity_id") 
    ID brother husband son wife 
1 A1 1003 1001 1004 1002 
2 A2  NA 2005 2006 NA 

Düzenleme: Ama şu Aradığınız sonucu verecek gibi görünüyor

Çözüm 1: hala bir satırda ---) her şeyi yapmak istiyorum Burada

df <- read.delim(text="ID entity_id type 
A1 1001  husband 
A1 1002  wife 
A1 1003  brother 
A1 1005  brother 
A1 1004  son 
A1 1006  son 
A2 2005  husband 
A2 2006  son", sep="") 

dcast(df, ID ~ type, value.var="entity_id", 
     fun.aggregate = function(...) paste0(..., collapse = "_")) 
    ID brother husband  son wife 
1 A1 1003_1005 1001 1004_1006 1002 
2 A2    2005  2006  

, ben bir araya toplar: bir hücreye her şeyi koyarak Birden çok örneği, kimliklerini birlikte yapıştırarak. Bununla daha sonra ne yapmak istediğini bilmiyorum, bu yüzden bunun sizin için yararlı bir tablo olup olmadığını bilmiyorum. Sadece bir olasılığa işaret etmek istiyorum. Söylemeye gerek yok, toplama işlevini ihtiyaçlarınıza göre değiştirebilirsiniz. Örneğin, onları bir araya yapıştırmak yerine, onları bir listeye koyabilirsiniz.

dcast(df, ID ~ type, value.var="entity_id", fun.aggregate = list) 
    ID brother husband  son wife 
1 A1 1003, 1005 1001 1004, 1006 1002 
2 A2    2005  2006  

Çözüm 2: eklemek sütunlar:

library(dplyr) 
new.df <- df %>% group_by(ID, type) %>% 
       mutate(type_num = paste(type, 1:n(), sep="_")) 
dcast(new.df, ID ~ type_num, value.var="entity_id") 
    ID brother_1 brother_2 husband_1 son_1 son_2 wife_1 
1 A1  1003  1005  1001 1004 1006 1002 
2 A2  NA  NA  2005 2006 NA  NA 
+0

Evet, "df $ dummy" ekleme hakkında yorumunuzda haklısınız. Cevabı test edip size geri dönecek –

+0

sabit! Bunun için teşekkürler, ama üzgünüm çözüm çalışmıyor! Tuhaf!!! –

+0

Yukarıdaki kod çalışır ancak kullanıyorum veri kümesindeki dcast, –

0

önemli benim açımdan gözetim, ancak gelecekte benim gibi birisi çıkarına.

:

Aynı türden için birden fazla giriş varsa Yukarıdaki sorun yalnızca ortaya çıkar, bu benim gerçek verilere yukarıdaki örnekte olduğu iki oğlu ve kardeşleri vardır bu

ID entity_id type 
A1 1001  husband 
A1 1002  wife 
A1 1003  brother 
A1 1005  brother 
A1 1004  son 
A1 1006  son 
A2 2005  husband 
A2 2006  son 

Bildirimi gibi görünür

since 'dcast' can't figure out how to resolve this, it ends up creating another row