使用R重塑每个唯一类别在新列中分类的数据框位置

时间:2018-09-28 16:30:52

标签: r loops reshape

假设我有以下数据框

 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

我正在尝试对其进行重塑,以使其在ID上折叠。对于每个唯一项,应创建一列,并且应在每列中添加适当的项,以使在任何一项中,只有一项。即itemA不应与itemB放在同一列中。

以下是我正在寻找的样本:

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

任何帮助!

2 个答案:

答案 0 :(得分:1)

我们可以使用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 :(得分:1)

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