我需要对数据集

时间:2016-03-19 12:29:22

标签: r similarity

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

Apple-3
Apple-California-4
Apple-China-3
Samsung-2
Samsung-India-2
Sony-AG-1
Sony-4
Sony-USA-4

我需要根据相似度得分将它们组合起来

Apple-10
Samsung-4
Sony-9

例如:Apple, Apple-China, Apple-California合并为Apple并将其值汇总起来。

有办法吗?

3 个答案:

答案 0 :(得分:1)

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

所以我将您的样本保存为CSV文件。然后使用短划线( - )作为数据框的分隔符。

df <- read.csv('Manufacturers.csv', header = F, sep = '-')

这将创建一个包含3列

的数据框
       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是一个因素,因此将其转换为数字。

df$V2 <- as.numeric(as.character(df$V2))

此时,V2和V3是一组带有NA的数字。让我们将这些NAs转换为零。

df$V2[is.na(df$V2)] <- 0
df$V3[is.na(df$V3)] <- 0

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

df$Quantity <-df$V2 + df$V3

然后将数量列相加。

aggregate(df$Quantity, by=list(Category=df$V1), FUN=sum)

这就是我得到的:

  Category  x
1    Apple 10
2  Samsung  4
3     Sony  9

快乐的编码!

-bg

答案 1 :(得分:1)

以下是gsubaggregate执行此操作的另一种方法。请注意,我事先将其从factor转换为character

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 

数据

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")

答案 2 :(得分:0)

您应该首先将字符位与得分分开:

# 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 - &gt; "Hell"