2012-09-26 46 views
0

我有以下問題大拇哥各地rownames,但沒有evail:合計值通過部分匹配R中

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 

是有這樣的功能?

+0

什麼是您的匹配標準?例如,如果三個行的名字是'abc','abd','abcd',你會合並它們嗎? –

+0

說,所有與abc ..但是,實際上我想能夠定製這與像agrep max.distance參數,或類似的東西.. – Kay

+0

你可以從adist(rownames(d))工作。這會給你所有的rownames對之間的距離矩陣,你可以使用它來聚集到一定的距離。你需要擺弄cost =參數才能得到你想要的。 – dcarlson

回答

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 
+0

.. @ mrdwab - 更好!! - 實際上這正是我想到的,但是,沒有得到解決 - 非常感謝!我建議在函數的第4行添加'RowNames < - row.names(data)'.. @dcarlson我寧願檢查mrdwab的答案,因爲它更直截了當。 – Kay

+0

.. @ mrdwab - 忘記我的編輯..在for循環中很愚蠢,我現在明白你的意思了。 – Kay

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 
+0

我認爲在'cutree(a,'''應該是'''rowclust''''''''','''''''',對吧? – A5C1D2H2I1M1N2O1R2T1

+0

感謝@dcarlson!adist正是我正在尋找..並使用分類分組很平滑! – Kay

+0

mrdwab是完全正確的。cutree(a應該是cutree(rowclus。。。 – dcarlson