2016-12-28 103 views
0

我有以下類型的數據(對國家+他們的如何減少數據幀,總結不同組合的

set.seed(123) 
data.frame(V1=c(rep('a',2), rep('b',2), rep('c',2)), V2=c('b', 'c', 'a', 'c', 'a', 'b'), V3=round(runif(6), 2)) 
    V1 V2 V3 
    a b 0.29 
    a c 0.79 
    b a 0.41 
    b c 0.88 
    c a 0.94 
    c b 0.05 

我想總結一下最後一列的配對組合,所以我有以下結果

combn(letters[1:3], 2) %>% t %>% as.data.frame() %>% cbind(V3=c(0.7, 1.73, 0.93)) 
    V1 V2 V3 
    a b 0.70 
    a c 1.73 
    b c 0.93 

我想這會很容易,如果我轉換的第一數據幀到一個很好的矩陣,但我不知道如何做到這一點。

+0

'集合(V3〜V1 + V2,df,sum)' – Jean

+0

'集合'或'tapply'函數是如此簡單和通常在R介紹中講授的典型問題,問這個問題讓我們想知道是否你在教程方面做了很多努力。 CRAN網站有大量的教程資料。 https://cran.r-project.org/other-docs.html; https://www.r-project.org/other-docs.html –

回答

0

使用pmin的d pmax到列V1 + V2按行排序,然後做彙總:

with(df, aggregate(V3, list(V1=pmin(V1, V2), V2 = pmax(V1, V2)), sum)) 

# V1 V2 x 
#1 a b 0.70 
#2 a c 1.73 
#3 b c 0.93 

注:爲了pminpmax工作,V1V2必須是文字的載體,而不是因素,這裏是數據我使用:

set.seed(123) 
df = data.frame(V1=c(rep('a',2), rep('b',2), rep('c',2)), 
       V2=c('b', 'c', 'a', 'c', 'a', 'b'), 
       V3=round(runif(6), 2), stringsAsFactors = F) 
0

我們可以使用dplyr

library(dplyr) 
df %>% 
    group_by(g1 = pmin(V1, V2), g2 = pmax(V1, V2)) %>% 
    summarise(V3 = sum(V3)) 
#  g1 g2 V3 
# <chr> <chr> <dbl> 
#1  a  b 0.70 
#2  a  c 1.73 
#3  b  c 0.93