通过部分匹配R中的行名称聚合 Dataframe 中的值

ve7v8dk2  于 2023-04-03  发布在  其他
关注(0)|答案(2)|浏览(140)

我正在思考下面的问题,但没有evail:

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

这个有什么功能吗?

sqxo8psd

sqxo8psd1#

这里有一个可能的解决方案,您可以修改它以满足您的需要。
一些注意事项:

  • 我不知道如何直接处理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
wfsdck30

wfsdck302#

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

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

相关问题