通过部分匹配R中的rownames来聚合数据框中的值

时间:2012-09-26 12:57:28

标签: r rowname

我遇到了以下问题,但无济于事:

d <- data.frame(value = 1:4, row.names = c("abc", "abcd", "ef", "gh"))
     value
abc      1
abcd     2
ef       3
gh       4

l <- nrow(d)
wordmat <- matrix(rep(NA, l^2), l, l, dimnames = list(row.names(d), row.names(d)))
for (i in 1:ncol(wordmat)) {
   rid <- agrep(colnames(wordmat)[i], rownames(wordmat), max = 0)
   d$matchid[i] <- paste(rid, collapse = ";") 
   }

# desired output:
(d_agg <- data.frame(value = c(3, 3, 4), row.names = c("abc;abcd", "ef", "gh")))
         value
abc;abcd     3
ef           3
gh           4

有这个功能吗?

2 个答案:

答案 0 :(得分:1)

这适用于您的示例,但可能需要调整真实的东西:

d <- data.frame(value = 1:4, row.names = c("abc", "abcd", "ef", "gh"))
rowclust <- hclust(as.dist(adist(rownames(d))), method="single")
rowgroups <- cutree(rowclust, h=1.5)
rowagg <- aggregate(d, list(rowgroups), sum)
rowname <- unclass(by(rownames(d), rowgroups, paste, collapse=";"))
rownames(rowagg) <- rowname
rowagg
         Group.1 value
abc;abcd       1     3
ef             2     3
gh             3     4

答案 1 :(得分:1)

这是一个可能的解决方案,您可以根据自己的需要进行修改。

一些注意事项:

  • 我无法弄清楚如何直接处理rownames(),尤其是在最后阶段,所以这取决于您是否乐意将行名复制为新变量。
  • 以下功能&#34;硬编码&#34;变量名,函数等。也就是说,它绝不是一个通用函数,而是一个在你深入研究这个问题时可能有用的函数。

这是功能。

matches <- function(data, ...) {
  temp = vector("list", nrow(data))
  for (i in 1:nrow(data)) {
    temp1 = agrep(data$RowNames[i], data$RowNames, value = TRUE, ...)
    temp[[i]] = data.frame(RowNames = paste(temp1, collapse = "; "),
                           value = sum(data[temp1, "value"]))
  }
  temp = do.call(rbind, temp)
  temp[!duplicated(temp$RowNames), ]
}

请注意,该函数需要一个名为RowNames的列,因此我们将创建该列,然后测试该函数。

d <- data.frame(value = 1:4, row.names = c("abc", "abcd", "ef", "gh"))
d$RowNames <- rownames(d)
matches(d)
#    RowNames value
# 1 abc; abcd     3
# 3        ef     3
# 4        gh     4
matches(d, max.distance = 2)
#            RowNames value
# 1         abc; abcd     3
# 3 abc; abcd; ef; gh    10
matches(d, max.distance = 4)
#            RowNames value
# 1 abc; abcd; ef; gh    10