gpt4 book ai didi

r - 修改 cSplit_e 函数以考虑多个值

转载 作者:行者123 更新时间:2023-12-04 00:52:56 25 4
gpt4 key购买 nike

我了解到“splitstackshape”中的“cSplit_e”可用于将一列下的多个值转换为具有二进制值的分隔列。我正在处理计算 tf-idf 的文本问题,并且不必在列下具有所有唯一值。例如,

docname   ftype                        doc_text
1 mw hello, hi, how, are, you, hello
2 gw hi,yo,man
3 mw woha,yo, yoman

输出(df)

   structure(list(docname = 1:3, ftype = c("mw", "gw", "mw"), doc_text = structure(1:3, .Label = c("hello, hi, how, are, you, hello", 
"hi,yo,man", "woha,yo, yoman"), class = "factor")), .Names = c("docname",
"ftype", "doc_text"), class = "data.frame", row.names = c(NA,
-3L))

对于上面的示例,如果我们考虑 doc-1,那么当“hello”出现两次时,cSplit_e 会将 doc_text 转换为 5 个值为“1”的独立列。有没有办法修改此函数以考虑重复值?

本质上,这就是我想要实现的目标:给定一个数据框

docname ftype doc_text 1 mw hello, hi, how, are, you, 你好 2 gw 嗨,哟,伙计 3 我 woha,yo, yoman

我想根据以“,”分隔的列值将 doc_text 转换为多列,并获取它们各自的频率。所以结果应该是

docname ftype are hello hi how man woha yo yoman you
1 mw 1 2 1 1 0 0 0 0 1
2 gw 0 0 1 0 1 0 1 0 0
3 mw 0 0 0 0 0 1 1 1 0

如果有人知道如何使用“splitstackshape”或其他方式完成此操作,我将不胜感激。最终目的是计算tf-idf。

谢谢。

最佳答案

我们可以在按 'doc_text' 拆分后使用 mtabulate 执行此操作

library(qdapTools)
cbind(df[1], mtabulate(strsplit(as.character(df$doc_text), ",\\s*")))
# docname are hello hi how man woha yo yoman you
#1 1 1 2 1 1 0 0 0 0 1
#2 2 0 0 1 0 1 0 1 0 0
#3 3 0 0 0 0 0 1 1 1 0

或者另一种选择是 tidyverse

library(tidyverse)
separate_rows(df, doc_text) %>% #split to long format
group_by(docname, doc_text) %>% #group by variables
tally() %>% #get the frequency
spread(doc_text, n, fill=0) #reshape to wide

或者按照@Frank的建议

library(splitstackshape)
cSplit(df, "doc_text", ",", "long")[, dcast(.SD, docname ~ doc_text)]

关于r - 修改 cSplit_e 函数以考虑多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42422078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com