我想知道如何按组计算不匹配的情况

让我们想象这是我的数据:

sek = rbind(c(1, 'a', 'a', 'a'),
        c(1, 'a', 'a', 'a'),
        c(2, 'b', 'b', 'b'),
        c(2, 'c', 'b', 'b'))

colnames(sek) <- c('Group', paste('t', 1:3, sep = ''))

数据看起来像这样
     Group t1  t2  t3
[1,] "1"   "a" "a" "a"
[2,] "1"   "a" "a" "a"
[3,] "2"   "b" "b" "b"
[4,] "2"   "c" "b" "b"

为了得到像
Group 1 : 0
Group 2 : 1

可以使用stringdist库来计算该值。

就像是
seqdistgroupStr = function(x) stringdistmatrix(x, method = 'hamming')

sek %>%
  as.data.frame() %>%
  group_by(Group) %>%
  seqdistgroupStr()

但这是行不通的。

有任何想法吗 ?

快速更新:
您将如何解决重量问题?例如,当在两个字符之间设置 mistmatch 时,如何传递参数-值(1,2,3,...)-。就像b和c之间的不匹配成本 2 而a和c之间的不匹配成本 1 等。

最佳答案

下面的代码将按组为您提供不匹配的数量,其中不匹配的定义是,每个级别的Group的每列t1,t2等中的唯一值的数量要少一个。我认为,仅当您需要的不只是二进制不匹配度量时,才需要引入字符串距离度量,但是对于您给出的示例,二进制度量就足够了。另外,如果您只需要每组中不同的行数,那么@Alex的解决方案将更加简洁。

library(dplyr)
library(reshape2)

sek %>% as.data.frame %>%
  melt(id.var="Group") %>%
  group_by(Group, variable) %>%
  summarise(mismatch = length(unique(value)) - 1) %>%
  group_by(Group) %>%
  summarise(mismatch = sum(mismatch))

  Group mismatch
1     1        0
2     2        1

这是一种较短的dplyr方法,用于计算单个不匹配项。它不需要重塑,但需要其他数据体操:
sek %>% as.data.frame %>%
  group_by(Group) %>%
  summarise_each(funs(length(unique(.)) - 1)) %>%
  mutate(mismatch = rowSums(.[-1])) %>%
  select(-matches("^t[1-3]$"))

关于r - R-按组计算不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31281125/

10-12 19:34