gpt4 book ai didi

r - 将数据集中的行组合成 R 中的类别

转载 作者:行者123 更新时间:2023-12-04 14:48:14 24 4
gpt4 key购买 nike

我正在尝试编写一个脚本,将相似的条目组合到共同的类别中。

我有数据集:

product <- c('Laptops','13" Laptops','Apple Laptops', '10 inch laptop','Laptop 13','TV','Big TV')
volume <- c(100,10,20,2,1,200,10)
dataset <- data.frame(product,volume)

看起来像:

         product volume
1 Laptops 100
2 13" Laptops 10
3 Apple Laptop 20
4 10 inch laptop 2
5 Laptop 13 1
6 TV 200
7 Big TV 10

我想做的是将所有类别组合在一起,例如在运行脚本后我希望数据集是:

         product volume
1 Laptops 113
2 Apple Laptop 20
3 TV 210

由于 Apple 是一个品牌,我希望它与类别保持分离。我不知道如何开始,但我想我需要一个 for 循环来遍历每一行,并检查产品名称中是否有品牌名称。例如。

brandlist <- 'Apple|Samsung'
if ( grepl(brandlist, dataset$product[i])) { Skip this row }

现在我需要定义类别名称 - 我通过查看搜索最多的产品来做到这一点,因为人们倾向于搜索类别。如果音量为 >100,则假设一行是一个类别。

categories <- c()
for ( i in 1:count(dataset) ) {
if ( dataset$volume[i] > 100 ) { categories <- c(categories , dataset$product[i] }}

现在我需要检查每个行名是否有某种程度的部分匹配...我正在考虑某种带有数字 + "+ 类别或其他方式的正则表达式。我也在考虑某种算法来检查有多少字母不同,例如允许 4 个字符不同,并且至少 5 个必须与类别完全匹配,因此笔记本电脑和 13"笔记本电脑将被归为一组,因为它们有 7 个相同的字符而有 4 个不同。

编辑:


我目前正在考虑以下解决方案:

我制作了一个类别列表,并创建了一个新的数据框,例如:

category <- c ('other', 'category 1', 'category 2')
volume <- c(0,0,0)
df <- data.frame(category,volume)

category volume
1 other 0
2 category 1 0
3 category 2 0

现在我想使用循环遍历上表中的结果,并匹配所有结果(基于对品牌和匹配的限制 - 它必须有 1 个相同的词并且在某些方面可能不同,然后将结果放入在新的数据框中。

最佳答案

您可以尝试以下。首先删除所有数字和符号,如 "\""。然后搜索品牌并提取最后的单词,如果找到品牌则更新并以小写字母打印。最后替换复数s。最后一步分组总结。当然,这是针对提供的 data.frame 的硬编码解决方案,但我看不到其他方式。

library(stringi)
library(tidyverse)
dataset %>%
mutate(p2=gsub("[[:digit:]]|\"","",product),
p2=stri_trim(p2)) %>%
mutate(p3=grepl(brandlist, p2)) %>%
mutate(p4=stri_extract_last_words(p2),
p4=ifelse(p3, grep(brandlist, p2, value=T), p4),
p4=tolower(p4),
p4=stri_replace_last_fixed(p4, "s","")) %>%
group_by(p4) %>%
summarise(volume=sum(volume)) %>%
select(product=p4, volume)
# A tibble: 3 x 2
product volume
<chr> <dbl>
1 laptop 113
2 tv 210
3 apple laptop 20

编辑:您还可以设置一个函数。但是你必须自己创建类别。请注意以单数形式和小写形式书写。

library(stringr)
foo <- function(data, product=product, volume=volume, brandlist, categories){
data %>%
mutate(p1=tolower(product)) %>%
mutate(p2=str_extract(p1, brandlist),
p2=ifelse(is.na(p2),"",p2)) %>%
mutate(p3=str_extract(p1, categories)) %>%
unite(Product, p2, p3, sep = " ") %>%
mutate(Product=str_trim(Product)) %>%
group_by(Product) %>%
summarise(volume=sum(volume))
}

foo(dataset, brandlist = 'apple|samsung',categories = "laptop|tv")
# A tibble: 3 x 2
Product volume
<chr> <dbl>
1 apple laptop 20
2 laptop 113
3 tv 210

foo(dataset, brandlist = 'apple|samsung',categories = "laptop|tv|big tv")
> foo(dataset, brandlist = 'apple|samsung',categories = "laptop|tv|big tv")
# A tibble: 4 x 2
Product volume
<chr> <dbl>
1 apple laptop 20
2 big tv 10
3 laptop 113
4 tv 200

关于r - 将数据集中的行组合成 R 中的类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46949799/

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