我想知道如何按组计算不匹配的情况。
让我们想象这是我的数据: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/