R 解包并重新排列数据

R 解包并重新排列数据,r,data.table,R,Data.table,我正在学习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)

我正在学习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)
在原始数据中,可能有A-I、A-Z或A-Q,不确定有多少

身份证也不确定会有多少人

所以我不能通过这个设置长度

 str_split_fixed(DT$place, "-", 11)
我应该做什么,或者找出我想做的关键字


谢谢

一个更简单的方法是使用
cSplit
splitstackshape
拆分为“long”格式,然后执行
dcast
重新格式化为“wide”格式,同时指定
乐趣。根据
长度将
聚合为逻辑条件

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
中,将列拆分为
单独的行
,获取
不同的行,创建一列1,并将
扩展为“宽”格式

library(dplyr)
library(tidyr)
DT %>%
   separate_rows(place) %>% 
   distinct(ID, place) %>%
   mutate(n = 1) %>% 
   spread(place, n, fill = 0)

或者在
base R
中,这可以通过将“place”列拆分为
向量的
列表来完成,获取
堆栈的

+(table(stack(setNames(strsplit(DT$place, "-"), DT$ID))[2:1]) > 0) 

A
数据表
-唯一的解决方案:

dcast(DT[,unlist(lapply(.SD,strsplit,“-”),“ID”],ID~V1,value.var=“V1”,fun.aggregate=length)
#ID A B C D E F H I K
#1:鸟0 0 1 0 1 0 1
#2:类别2 1 0 0 1 0
#3:狗311010
这将提供“长度”而不是“是/否”。要达到这一水平:

dcast(DT[,unlist(lappy(.SD,strsplit,“-”),“ID”],ID~V1,value.var=“V1”,fun.aggregate=length)[,lappy(.SD,min,1),by=“ID”]
#ID A B C D E F H I K
#1:鸟0 0 1 0 1 0 1
#2:第1类10
#3:狗1110
我发现使用
magrittr
的管道更容易看到:

库(magrittr)
DT[,未列出(lapply(.SD,strsplit,“-”),“ID”]%>%
dcast(ID~V1,value.var=“V1”,fun.aggregate=长度)%>%
[,lappy(.SD,min,1),by=“ID”]

您可以使用
+(table(stack(setNames)(strsplit(DT$place,“-”,DT$ID))[2:1])>0)
或使用
dcast
dcast(cSplit(DT,“place”,“-”,“long”),ID~place,函数(x)as.integer(length(x)>0))
“dog”在不同的位置有三个A,为什么结果是一个1?@r2evans是的,我希望1=Yes,0=no,不是计算的总和,我想的是“长度”而不是“总和”,但这只是一个细节(和另一行代码,相对来说微不足道)。另一个变体,将tidyverse的答案翻译回DT/splitstackshape:
dcast(unique(cSplit(DT,“place”、“-”、“long”)[,v:=1],ID~place,fill=0)
library(dplyr)
library(tidyr)
DT %>%
   separate_rows(place) %>% 
   distinct(ID, place) %>%
   mutate(n = 1) %>% 
   spread(place, n, fill = 0)
+(table(stack(setNames(strsplit(DT$place, "-"), DT$ID))[2:1]) > 0)