R 解包并重新排列数据
我正在学习arule,我需要将当前数据转换为as.matrix 我尝试将项目分解,然后呈现0和1R 解包并重新排列数据,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)
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)