我正在学习arule,我需要将当前数据转换为as.matrix
我试图将项目拆开,然后显示0和1
library(data.table)
DT <- data.table(ID=c("dog","dog","dog","cat","cat","bird"),
place=c("F-A-C","A-B-E","H-A","A-I-C-D","B-A","D-K-H-F"),
stringsAsFactors = FALSE)
我找到了这种方法,但不是我想要的结果
library(stringr)
library(plyr)
DTa <- str_split(DT$place, "-")
DTa <- ldply(DTa ,rbind)
DT <- cbind(DT$ID, DTa)
output:
DT$ID 1 2 3 4
1 dog F A C NA
2 dog A B E NA
3 dog H A NA NA
4 cat A I C D
5 cat B A NA NA
6 bird D K H F
我希望结果是这样
DT$ID A B C D E F G H I ..... K
1 dog 1 1 1 0 1 1 0 1 0 ..... 0
2 cat 1 1 1 1 0 0 0 0 1 ..... 0
3 bird 0 0 0 1 0 1 0 1 0 ..... 1
在原始数据中,可能有A-I,A-Z或A-Q,不确定多少
而且ID不确定会有多少个。
因此,我无法通过此设置长度。
str_split_fixed(DT$place, "-", 11)
我应该怎么做或找出我想做什么关键词?
谢谢
最佳答案
一种更简单的方法是使用cSplit
中的splitstackshape
拆分为“长”格式,然后执行dcast
重塑为“宽”格式,同时根据fun.aggregate
将length
指定为逻辑条件
library(splitstackshape)
library(data.table)
dcast(cSplit(DT, "place", "-", 'long'),
ID ~ place, function(x) as.integer(length(x) > 0))
或者按照@Frank的建议
dcast(unique(cSplit(DT, "place", "-", 'long'))[, v := 1], ID ~ place, fill=0)
或在
tidyverse
中,用separate_rows
拆分列,获取distinct
行,创建一个1列,并将spread
创建为“宽”格式library(dplyr)
library(tidyr)
DT %>%
separate_rows(place) %>%
distinct(ID, place) %>%
mutate(n = 1) %>%
spread(place, n, fill = 0)
或者在
base R
中,这可以通过将“place”列拆分为list
的vector
来完成,获得table
的stack
和list
+(table(stack(setNames(strsplit(DT$place, "-"), DT$ID))[2:1]) > 0)
关于r - 解压缩并重新排列数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57116595/