如何在频率矩阵中拆分r文本?

时间:2016-02-06 11:51:58

标签: r

从使用

导入的数据开始
dati<- ( read.csv(file='C:...csv', header=TRUE, sep=";"))

我选择了两个变量

id<-dati$post_visid_low
item<-dati$event_list

id<-as.character(id)
item<-as.character(item)

dataT <- data.table(id, it EM) dataT的结构是

id   item
1    102, 104, 108,401
2    405, 103, 650, 555, 450
3    305, 109

我希望通过自定义列

获取此频率矩阵
id  102  103  104  108 109  305  401   405   450    555   650
1    1         1    1
2         1                             1     1      1
3                        1    1

我该怎么做? 我试过

library(Matrix)
id<-as.character(id)
item<-as.character(item)
dataT <- data.table(id, item)
lst <- strsplit(dataT$item, '\\s*,\\s*')
Un1 <- sort(unique(unlist(lst)))
sM <-  sparseMatrix(rep(dataT$id, length(lst)), 
                    match(unlist(lst), Un1), x= 1, 
                    dimnames=list(dataT$id, Un1))

但是我接受了这个错误

Error in i + (!(m.i || i1)) : non-numeric argument to binary operator

我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

我们可以使用包splitstackshape来帮助我们进行拆分,然后使用融合和转换的组合来获取您指定格式的数据(请注意,数字并不总是实用的)专栏名称。

library(splitstackshape)

# split the data
step1 <- cSplit(dat, splitCols="item")
step1
#    id item_1 item_2 item_3 item_4 item_5
# 1:  1    102    104    108    401     NA
# 2:  2    405    103    650    555    450
# 3:  3    305    109     NA     NA     NA

# reshape it and remove missings
step2 <- melt(step1, id.vars="id")[!is.na(value),]

# turn to wide
output <- dcast(step2, id~value, fun.aggregate = length)

# or in one line

output <- dcast(melt(cSplit(dat, splitCols="item"), id.vars="id")[!is.na(value),], 
                id~value, fun.aggregate = length)

output
#    id 102 103 104 108 109 305 401 405 450 555 650
# 1:  1   1   0   1   1   0   0   1   0   0   0   0
# 2:  2   0   1   0   0   0   0   0   1   1   1   1
# 3:  3   0   0   0   0   1   1   0   0   0   0   0

或者,您可以使用同一个包中的cSplit_e

cSplit_e(dat, "item", ",", type = "character", fill = 0, drop = TRUE)
  id item_102 item_103 item_104 item_108 item_109 item_305 item_401 item_405 item_450 item_555 item_650
# 1  1        1        0        1        1        0        0        1        0        0        0        0
# 2  2        0        1        0        0        0        0        0        1        1        1        1
# 3  3        0        0        0        0        1        1        0        0        0        0        0

使用的数据:

dat <- data.frame(id=1:3, item=c("102, 104, 108,401","405, 103, 650, 555, 450","305, 109"))