0

我正在解决以下问题,但没有成功:

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

有这个功能吗?

4

2 回答 2

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
于 2012-09-26T17:07:14.380 回答
1

这是一个可能的解决方案,您可以对其进行修改以满足您的需求。

一些注意事项:

  • 我不知道如何rownames()直接处理,特别是在最后阶段,所以这取决于你是否对将行名复制为新变量感到满意。
  • 下面的函数“硬编码”变量名称、函数等。也就是说,它绝不是一个广义函数,而是当你进一步研究这个问题时可能有用的函数。

这是功能。

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
于 2012-09-26T17:32:01.050 回答