我在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
并将其值汇总起来。
有办法吗?
答案 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)
以下是gsub
和aggregate
执行此操作的另一种方法。请注意,我事先将其从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"