组之间列中元素的比较

时间:2017-01-20 23:11:50

标签: r

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 

...但我不知道如何一次只为一个类别带来差异。是否有捷径可寻?非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

以下是使用bysapplyaggregate执行此操作的方法。使用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 Groupsummarise,然后像我们之前那样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