首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要给我的数据集中的元素一个相似度分数

我需要给我的数据集中的元素一个相似度分数
EN

Stack Overflow用户
提问于 2016-03-19 20:29:22
回答 3查看 51关注 0票数 1

我在R中有一个类似于虚拟对象的数据集,如下所示:

代码语言:javascript
复制
Apple-3
Apple-California-4
Apple-China-3
Samsung-2
Samsung-India-2
Sony-AG-1
Sony-4
Sony-USA-4

我需要根据相似度分数将它们组合为

代码语言:javascript
复制
Apple-10
Samsung-4
Sony-9

例如:将Apple, Apple-China, Apple-California合并到Apple中,并对它们的值进行求和。

有没有办法做到这一点?

EN

回答 3

Stack Overflow用户

发布于 2016-03-19 21:44:37

这真的应该是一个字符串操作练习,但我认为如果不使用字符串函数,这将是一个有趣的挑战。

所以我把你的样本保存为CSV文件。然后使用破折号(-)作为数据帧的分隔符。

代码语言:javascript
复制
df <- read.csv('Manufacturers.csv', header = F, sep = '-')

这将创建一个包含3列的数据框

代码语言:javascript
复制
       V1         V2 V3
1   Apple          3 NA
2   Apple California  4
3   Apple      China  3
4 Samsung          2 NA
5 Samsung      India  2
6    Sony         AG  1
7    Sony          4 NA
8    Sony        USA  4

由于V2是一个因子,因此将其转换为数字。

代码语言:javascript
复制
df$V2 <- as.numeric(as.character(df$V2))

在这一点上,V2和V3是一堆带NAs的数字。让我们将这些NAs转换为0。

代码语言:javascript
复制
df$V2[is.na(df$V2)] <- 0
df$V3[is.na(df$V3)] <- 0

将V2和V3一起添加到新列中。我给我的数量打了电话。

代码语言:javascript
复制
df$Quantity <-df$V2 + df$V3

然后对数量列求和。

代码语言:javascript
复制
aggregate(df$Quantity, by=list(Category=df$V1), FUN=sum)

这就是我得到的:

代码语言:javascript
复制
  Category  x
1    Apple 10
2  Samsung  4
3     Sony  9

祝你编码愉快!

-bg

票数 1
EN

Stack Overflow用户

发布于 2016-03-19 22:57:35

这是gsubaggregate的另一种方法。请注意,我事先将其从factor转换为character

代码语言:javascript
复制
d$names <- gsub("-.*", "", d$V1)
d$values <- as.numeric(gsub("[^\\d]", "", d$V1, perl = TRUE))
aggregate(values ~ names, d, sum)
#    names values
#1   Apple     10
#2 Samsung      4
#3    Sony      9 

DATA

代码语言:javascript
复制
dput(d)
structure(list(V1 = c("Apple-3", "Apple-California-4", "Apple-China-3", 
"Samsung-2", "Samsung-India-2", "Sony-AG-1", "Sony-4", "Sony-USA-4"
), names = c("Apple", "Apple", "Apple", "Samsung", "Samsung", 
"Sony", "Sony", "Sony"), values = c(3, 4, 3, 2, 2, 1, 4, 4)), .Names = c("V1", 
"names", "values"), row.names = c(NA, -8L), class = "data.frame")
票数 1
EN

Stack Overflow用户

发布于 2016-03-19 20:46:35

您应该首先将字符比特与分数分开:

代码语言:javascript
复制
# 2 rows one with ID and one with score
company <- as.matrix(c("Apple", "Apple-California", "Apple-China", "Samsung" ))
score   <- as.matrix(c(3, 4,3, 2))

# bind columns create a frame
data <- cbind(company, score)

# this will return which rows contain the word "Apple"

n <- grep("Apple", data[,1])

同样需要知道的是如何对字符向量进行子集,以便去除多余的位

看看strsplit(), paste()paste0()函数。

第一个将帮助您将文本分解为单独的字符。后者将帮助您将内容重新粘贴到一起:

另一个容易使用的是substr("HEllo", 1,4),它将输出字符1到4 -> "Hell"

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36101741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档