从使用
导入的数据开始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
我怎么能这样做?
答案 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"))