假设我有以下数据框
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
任何帮助!
答案 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