使用 R 重塑数据框在新列中为每个唯一类别分类
Reshape dataframe place categorical in new column for each unique category using R
假设我有以下数据框
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 上折叠。对于每个唯一的项目,应该创建一列,并且适当的项目应该放在每一列中,这样在任何 1 项目列中只有 1 项目。即 itemA 不应与 itemB 在同一列中。
这是我正在寻找的示例:
> test
ID time Item1 Item2 Item3 Item4
1 1 11 itemA - itemC -
2 2 12 - itemB - -
4 3 13 - - - itemD
感谢任何帮助!
我们可以使用tidyverse
创建一个序列列然后spread
到'wide'格式
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
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
假设我有以下数据框
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 上折叠。对于每个唯一的项目,应该创建一列,并且适当的项目应该放在每一列中,这样在任何 1 项目列中只有 1 项目。即 itemA 不应与 itemB 在同一列中。
这是我正在寻找的示例:
> test
ID time Item1 Item2 Item3 Item4
1 1 11 itemA - itemC -
2 2 12 - itemB - -
4 3 13 - - - itemD
感谢任何帮助!
我们可以使用tidyverse
创建一个序列列然后spread
到'wide'格式
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
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