因此,我尝试根据帧中特定列是否包含特定单词来创建虚拟变量以附加到数据帧。该列看起来像这样:
dumcol = c("good night moon", "good night room", "good morning room", "hello moon")
我将根据每行中包含的单词创建虚拟变量,例如:对于第一个,它包含"good", "night",
和"moon"
,但不包含"room", "morning"
或"hello"
。
到目前为止,我以一种非常原始的方式处理它的方式是创建一个适当大小的0值矩阵,然后像这样使用for循环:
result=matrix(ncol=6,nrow=4)
wordlist=unique(unlist(strsplit(dumcal, " ")))
for (i in 1:6)
{ result[grep(wordlist[i], dumcol),i] = 1 }
或类似的东西。我猜这是一种更快/更资源有效的方法。有什么建议吗?
答案 0 :(得分:3)
你可以尝试:
library(tm)
myCorpus <- Corpus(VectorSource(dumcol))
myTDM <- TermDocumentMatrix(myCorpus, control = list(minWordLength = 1))
as.matrix(myTDM)
给出了:
# Docs
#Terms 1 2 3 4
# good 1 1 1 0
# hello 0 0 0 1
# moon 1 0 0 1
# morning 0 0 1 0
# night 1 1 0 0
# room 0 1 1 0
如果您想在列中使用虚拟变量,则可以改为使用DocumentTermMatrix
:
# Terms
#Docs good hello moon morning night room
# 1 1 0 1 0 1 0
# 2 1 0 0 0 1 1
# 3 1 0 0 1 0 1
# 4 0 1 1 0 0 0
答案 1 :(得分:3)
尝试
library(qdapTools)
mtabulate(strsplit(dumcol, ' '))
# good hello moon morning night room
#1 1 0 1 0 1 0
#2 1 0 0 0 1 1
#3 1 0 0 1 0 1
#4 0 1 1 0 0 0
或者
library(splitstackshape)
cSplit_e(as.data.frame(dumcol), 'dumcol', sep=' ',
type='character', fill=0, drop=TRUE)
# dumcol_good dumcol_hello dumcol_moon dumcol_morning dumcol_night dumcol_room
#1 1 0 1 0 1 0
#2 1 0 0 0 1 1
#3 1 0 0 1 0 1
#4 0 1 1 0 0 0
答案 2 :(得分:2)
我愿意
sdum <- strsplit(dumcol," ")
us <- unique(unlist(sdum))
res <- sapply(sdum,function(x)table(factor(x,levels=us)))
# [,1] [,2] [,3] [,4]
# good 1 1 1 0
# night 1 1 0 0
# moon 1 0 0 1
# room 0 1 1 0
# morning 0 0 1 0
# hello 0 0 0 1
结果可以用t(res)
转换为列中的虚拟变量(R约定)。