This thread包含有关如何获取组之间匹配字符串数量的有用说明。但是,我想知道每个类别的特定组有多少字符串是唯一的。
示例:
System.TypeInitializationException
对于B组,该函数将在类别1中返回一个唯一的字符串,在2中为1,在3中为2。
Category Group Text_Strings
1 A string1
1 A string2
1 B string1
1 B string2
1 B string3
2 A string1
2 A string3
2 B string3
3 A string1
3 A string2
3 A string3
3 B string4
3 B string5
对于A组,它将返回:
Category Count
1 1
2 0
3 2
根据另一个线程的建议,找到唯一的字符串应该像下面这样简单:
Category Count
1 0
2 1
3 3
...但我不知道如何一次只为一个类别带来差异。是否有捷径可寻?非常感谢您的帮助!
答案 0 :(得分:1)
以下是使用by
,sapply
和aggregate
执行此操作的方法。使用by
,我们按类别计算每个字符串的其他字符串匹配数。我们的计算是通过使用Text_Strings
遍历sapply
中的每个字符串来执行的。执行此操作后,我们会unlist
结果,cbind
结果会显示原始数据dat
。然后,我们对aggregate
执行简单调用,以查看每个类别和群组有多少OtherMatches == 0
。
dat <- cbind(dat,
'OtherMatches' = unlist(
by(dat, dat$Category, function(x)
sapply(x$Text_Strings,
FUN = function(y) sum(y == x$Text_Strings) - 1))))
dat2 <- aggregate(OtherMatches ~ Category + Group, data = dat,
FUN = function(x) sum(x == 0))
setNames(dat2, c('Category', 'Group', 'Count'))
Category Group Count
1 1 A 0
2 2 A 1
3 3 A 3
4 1 B 1
5 2 B 0
6 3 B 2
这是另一种方式,再次使用split-apply-combine框架。这一次,我们将使用一点R
和一点dplyr
。首先,我们split
Category
数据lapply
。然后,我们使用cbind
对拆分数据进行操作,使用sapply
添加使用unsplit
计算的新列(如前所述)。我们使用group_by
组合数据,然后我们Category
Group
和summarise
,然后像我们之前那样library(dplyr)
split(dat, dat$Category) %>%
lapply(., FUN = function(x)
cbind(x,
'OtherMatches' =
sapply(x$Text_Strings,
FUN = function(y) sum(y == x$Text_Strings) - 1))) %>%
unsplit(dat$Category) %>%
group_by(Category, Group) %>%
summarise(Count = sum(OtherMatches == 0))
Source: local data frame [6 x 3]
Groups: Category [?]
Category Group Count
<int> <chr> <int>
1 1 A 0
2 1 B 1
3 2 A 1
4 2 B 0
5 3 A 3
6 3 B 2
。
dat <- structure(list(
Category = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L),
Group = c("A", "A", "B", "B", "B", "A", "A", "B", "A", "A", "A", "B", "B"),
Text_Strings = c("string1", "string2", "string1", "string2", "string3",
"string1", "string3", "string3", "string1", "string2",
"string3", "string4", "string5")),
.Names = c("Category", "Group", "Text_Strings"), class = "data.frame",
row.names = c(NA, -13L))
Sub Color()
lastrow = ActiveSheet.UsedRange.Rows.Count
For i = 2 To lastrow
If Cells(i, 1).Value = Cells(i - 1, 1).Value Then
r = WorksheetFunction.RandBetween(0, 255)
g = WorksheetFunction.RandBetween(0, 255)
b = WorksheetFunction.RandBetween(0, 255)
Cells(i, 1).Interior.Color = RGB(r, g, b)
Else
Cells(i, 1).Interior.Color = RGB(r, g, b)
End If
Next i
End Sub