Say that I have this data frame:
1 2 3 4
100 8 12 5 14
99 1 6 4 3
98 2 5 4 11
97 5 3 7 2
In this above data frame, the values indicate counts of how many observations take on (100, 1), (99, 1)
, etc.
In my context, the diagonals have the same meanings:
1 2 3 4
100 A B C D
99 B C D E
98 C D E F
97 D E F G
How would I sum across the diagonals (i.e., sum the counts of the like letters) in the first data frame?
This would produce:
group sum
A 8
B 13
C 13
D 28
E 10
F 18
G 2
For example, D
is 5+5+4+14
You can use
row()
andcol()
to identify row/column relationships.or (as suggested in comments by ?@thelatemail)
or (@Frank)
as.matrix()
is required to makesplit()
work correctly ...Another solution using bgoldst's definition of
df1
anddf2
Gives
(Not quite the format that you wanted, but maybe it's ok...)
Here's a solution using
stack()
, andaggregate()
, although it requires the second data.frame contain character vectors, as opposed to factors (could be forced withlapply(df2,as.character)
):Another
aggregate
variation, avoiding the formula interface, which actually complicates matters in this instance: