通过部分匹配R中的行名来聚合dataframe中的值

通过部分匹配R中的行名来聚合dataframe中的值,r,rowname,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)

我正在仔细研究以下问题,但没有任何评估:

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

d这适用于您的示例,但可能需要针对实际情况进行调整:

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

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

一些注意事项:

  • 我不知道如何直接处理
    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), ]
}

你的匹配标准是什么?例如,如果三个行名是
abc
abd
abd
,您是否要将它们组合在一起?比如说,全部与abc一起。。但是,实际上,我希望能够使用带有max.distance参数的agrep或者类似的东西来定制这个。您能从adist(rownames(d))工作吗。这将为您提供一个所有行名对之间的距离矩阵,您可以使用它来聚集到某个距离。你需要摆弄costs=参数才能得到你想要的东西。我认为
cutree(a,
中的
a
应该是“
rowclust
”,对吗?谢谢@dcarlson!adist正是我要搜索的..并且使用分类进行分组是很巧妙的!请多多欣赏!mrdwab完全正确。cutree(a应该是cutree(rowclus…@mrdwab-更好!!-事实上这正是我的想法,但没有绕开-非常感谢!我建议添加
RowNames..@mrdwab-忘记我的编辑..在for循环中这很愚蠢。我现在明白你的意思了。。
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