如何总结数据框的对角线

时间:2015-04-29 23:47:35

标签: r sum dataframe diagonal

说我有这个数据框:

     1   2   3   4      
100  8   12  5   14 
99   1   6   4   3   
98   2   5   4   11  
97   5   3   7   2   

在上面的数据框中,这些值表示(100, 1), (99, 1)等观察的观察数量。

在我的上下文中,对角线具有相同的含义:

     1   2   3   4
100  A   B   C   D 
99   B   C   D   E  
98   C   D   E   F 
97   D   E   F   G

如何在第一个数据框中对角线(即,相似字母的数量之和)求和?

这会产生:

group  sum
A      8
B      13
C      13
D      28
E      10
F      18
G      2

例如,D5+5+4+14

4 个答案:

答案 0 :(得分:18)

您可以使用row()col()来识别行/列关系。

m <- read.table(text="
    1   2   3   4      
100  8   12  5   14 
99   1   6   4   3   
98   2   5   4   11  
97   5   3   7   2")

vals <- sapply(2:8,
       function(j) sum(m[row(m)+col(m)==j]))

或(如?@thelatemail的评论所示)

vals <- sapply(split(as.matrix(m), row(m) + col(m)), sum)
data.frame(group=LETTERS[seq_along(vals)],sum=vals)

或(@Frank)

data.frame(vals = tapply(as.matrix(m), 
       (LETTERS[row(m) + col(m)-1]), sum))
需要

as.matrix()才能使split()正常工作......

答案 1 :(得分:7)

另一个aggregate变体,避免使用公式界面,这实际上使这个例子中的问题复杂化:

aggregate(list(Sum=unlist(dat)), list(Group=LETTERS[c(row(dat) + col(dat))-1]), FUN=sum)

#  Group Sum
#1     A   8
#2     B  13
#3     C  13
#4     D  28
#5     E  10
#6     F  18
#7     G   2

答案 2 :(得分:6)

使用bgoldst定义df1df2

的另一种解决方案
sapply(unique(c(as.matrix(df2))),function(x) sum(df1[df2==x]))

给出

#A  B  C  D  E  F  G 
#8 13 13 28 10 18  2 

(不完全是你想要的格式,但也许没关系......)

答案 3 :(得分:5)

这里是使用aggregate()lapply(df2,as.character)的解决方案,虽然它需要第二个data.frame包含字符向量,而不是因素(可以强制使用df1 <- data.frame(a=c(8,1,2,5), b=c(12,6,5,3), c=c(5,4,4,7), d=c(14,3,11,2) ); df2 <- data.frame(a=c('A','B','C','D'), b=c('B','C','D','E'), c=c('C','D','E','F'), d=c('D','E','F','G'), stringsAsFactors=F ); aggregate(sum~group,data.frame(sum=stack(df1)[,1],group=stack(df2)[,1]),sum); ## group sum ## 1 A 8 ## 2 B 13 ## 3 C 13 ## 4 D 28 ## 5 E 10 ## 6 F 18 ## 7 G 2 ) :

sizeWithAttributes(attributes)