我正在学习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.aggregatelength指定为逻辑条件

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”列拆分为listvector来完成,获得tablestacklist
+(table(stack(setNames(strsplit(DT$place, "-"), DT$ID))[2:1]) > 0)

关于r - 解压缩并重新排列数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57116595/

10-12 14:01
查看更多