2016-12-28 100 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