मान लीजिए मेरे पास निम्न डेटाफ़्रेम है

 test <- data.frame(items = c("itemA", "itemB","itemC", "itemD"),
          ID = c("1","2","1","3"),
          time = c("11","12","11","13"))

> test
     items ID time
   1 itemA  1   11
   2 itemB  2   12
   3 itemC  1   11
   4 itemD  3   13

मैं इसे फिर से आकार देने की कोशिश कर रहा हूं ताकि यह आईडी पर गिर जाए। प्रत्येक अद्वितीय आइटम के लिए एक कॉलम बनाया जाना चाहिए और प्रत्येक कॉलम में उपयुक्त आइटम इस तरह जाना चाहिए कि किसी भी 1 आइटम कॉलम में केवल 1 आइटम हो। यानी आइटम ए आइटम बी के समान कॉलम में नहीं होना चाहिए।

मैं जो खोज रहा हूं उसका एक नमूना यहां दिया गया है:

> test
     ID time Item1   Item2   Item3    Item4
   1 1   11   itemA    -      itemC    -
   2 2   12    -      itemB    -       -
   4 3   13    -        -      -      itemD  

किसी भी मदद की सराहना की!

1
Ellie 28 सितंबर 2018, 19:30

2 जवाब

सबसे बढ़िया उत्तर

Data.table आमतौर पर तेज़ होता है... यदि आप थोड़े भिन्न कॉलम-नामों के साथ रह सकते हैं, तो इसे आज़माएं

library( data.table )
dcast( setDT( test ), ID + time ~ items, value.var = "items" )

#    ID time itemA itemB itemC itemD
# 1:  1   11 itemA  <NA> itemC  <NA>
# 2:  2   12  <NA> itemB  <NA>  <NA>
# 3:  3   13  <NA>  <NA>  <NA> itemD
1
Wimpel 28 सितंबर 2018, 20:04

हम अनुक्रम कॉलम बनाने के लिए tidyverse का उपयोग कर सकते हैं और फिर spread को 'विस्तृत' प्रारूप में उपयोग कर सकते हैं

library(tidyverse)
test %>%      
   mutate(rn = paste0("Item", row_number())) %>% 
   spread(rn, items)
# ID time Item1 Item2 Item3 Item4
#1  1   11 itemA  <NA> itemC  <NA>
#2  2   12  <NA> itemB  <NA>  <NA>
#3  3   13  <NA>  <NA>  <NA> itemD
1
akrun 28 सितंबर 2018, 19:45