我有一个data.frame keywordsCategory
,其中包含一组我想要根据我想要检查的单词进行分类的短语 .
例如,我的一个"check terms"是test1,对应于类别cat1 . 作为我的data.frame的第一个观察是这是一个test1,我需要包含一个新列 category 与相应的类别 .
因为一个观察可以分配给多个类别,我认为最好的选择是使用 grepl
创建我的data.frame的独立子集,以便最近在新数据中绑定所有数据 .
library(data.table)
wordsToCheck <- c("test1", "test2", "This")
categoryToAssign <- c("cat1", "cat2", "cat3")
keywordsCategory <- data.frame(Keyword=c("This is a test1", "This is a test2"))
for (i in 1:length(wordsToCheck)) {
myOriginal <- wordsToCheck[i]
myCategory <- categoryToAssign[i]
dfToCreate <- paste0("withCategory",i)
assign(dfToCreate,
data.table(keywordsCategory[grepl(paste0(".*",myOriginal,".*"),
keywordsCategory$Keyword)==TRUE,]))
# this wont work :(
# dfToCreate[,category:=myCategory]
}
# Create a list with all newly created data.tables
l.df <- lapply(ls(pattern="withCategory[0-9]+"), function(x) get(x))
# Create an aggregated dataframe with all Keywords data.tables
newdf <- do.call("rbind", l.df)
子集> rbind有效,但我无法将相应的类别分配给我新创建的data.tables . 如果我取消注释该行,我会收到以下错误:
错误:=(category,myCategory):检查is.data.table(DT)== TRUE . 否则,:=和:=(...)被定义为仅用于j,一次且特定方式 . 请参阅help(“:=”) .
但是,如果我在循环完成后手动添加列,f.i:
withCategory1[,category:=myCategory]
它正常工作,表输出是预期的:
> withCategory1
V1 category
1: This is a test1 cat2
tableOutput <- structure(list(V1 = structure(1L, .Label = c("This is a test1",
"This is a test2"), class = "factor"), category = "cat2"), .Names = c("V1",
"category"), row.names = c(NA, -1L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x00000000001f0788>)
当使用assign函数在循环内创建新列时,哪个是向data.table添加新列的最佳/最安全的方法?该解决方案不需要使用data.tables,因为我只使用它,因为我的真实数据有数百万的观察,我认为data.table会更快 .
1 回答
作为for循环的替代方法,您可以使用
paste0
,mapply
和grepl
来获取所需内容:这使:
如果要将类别列扩展为每行上的一个类别,请参阅this Q&A以了解如何执行此操作的几种方法 . 例如:
你得到: