r - 计算总和矩阵

标签 r data.table reshape2

假设我有一个 data.frame,其中包含几列分类数据和一列定量数据。这是一个例子:

my_data <- structure(list(A = c("f", "f", "f", "f", "t", "t", "t", "t"), 
                          B = c("t", "t", "t", "t", "f", "f", "f", "f"), 
                          C = c("f","f", "t", "t", "f", "f", "t", "t"), 
                          D = c("f", "t", "f", "t", "f", "t", "f", "t")),
                     .Names = c("A", "B", "C", "D"), 
                     row.names = 1:8, class = "data.frame")
my_data$quantity <- 1:8

现在 my_data 看起来像这样:

  A B C D quantity
1 f t f f        1
2 f t f t        2
3 f t t f        3
4 f t t t        4
5 t f f f        5
6 t f f t        6
7 t f t f        7
8 t f t t        8

获取交叉表/数量总和(其中两个值均=='t')的最优雅方法是什么?也就是说,我正在寻找这样的输出:

   A   B   C   D  
A "?" "?" "?" "?"
B "?" "?" "?" "?"
C "?" "?" "?" "?"
D "?" "?" "?" "?"

..其中 x/y 的交集是 quantity 的总和,其中 x=='t'y=='t'. (我真的只关心这个表的一半,因为一半是重复的)

例如,A/C 的值应该是:

good_rows <- with(my_data, A=='t' & C=='t')
sum(my_data$quantity[good_rows])

15

*编辑:我已经拥有的是:

nodes <- names(my_data)[-ncol(my_data)]
sapply(nodes, function(rw) {
  sapply(nodes, function(cl) {
    good_rows <- which(my_data[, rw]=='t' & my_data[, cl]=='t')
    sum(my_data[good_rows, 'quantity'])
  })
})

这给出了期望的结果:

   A  B  C  D
A 26  0 15 14
B  0 10  7  6
C 15  7 22 12
D 14  6 12 20

我喜欢这个解决方案,因为它非常“字面化”,具有相当的可读性:两个应用函数(又名循环)来遍历行*列,计算每个单元格,并生成矩阵。对于我的实际数据(很小:192 行 x 10 列)也足够快。我不喜欢它,因为它看起来有很多台词。感谢您迄今为止的回答!我会复习并吸收。

最佳答案

尝试使用矩阵乘法

temp <- (my_data[1:4]=="t")*my_data$quantity

t(temp) %*% (my_data[1:4]=="t") 

#   A  B  C  D
#A 26  0 15 14
#B  0 10  7  6
#C 15  7 22 12
#D 14  6 12 20

(尽管这可能是侥幸)

关于r - 计算总和矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26131834/

相关文章:

arrays - 如何用 tidyr 替换数组的 reshape2::melt?

r - 将相同数据帧的列表熔化到 R 中的一个数据帧

R/Index 下三角向量(按成对索引)

r - 将版本控制代码返回到 RStudio 的最快方法

r - 将值从宽更改为长 : 1) Group_By, 2) Spread/Dcast

r - R中两个数据表之间按行计算匹配元素

r - 如何在R中的ggplot中将图例添加到geom_smooth

r - 如何在 Shiny 的r中隐藏特定用户的menuItem及其包含内容?

r - 在避免循环的同时计算 "smaller"行数比其他行数

r - 根据另一列中的最大值选择一个值