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 に答える