【问题标题】:Making a proportion table for the same variables against each other in R by satisfying a condition通过满足一个条件,为 R 中的相同变量制作比例表
【发布时间】:2019-09-05 15:36:05
【问题描述】:

我有一个像这样的非常大的数据框 假设我们在数据框中只有 8 个人,如下面的 R 代码所示

注意 'df' 中的每一行代表一个人

football <- c(1,1,1,1,0,0,0,0)
basketball <- c(1,1,0,0,0,0,0,1)
other <- c(1,0,0,0,0,0,0,0)

df<- data.frame(football, basketball, other)

我正在尝试使用足球(或数据框中的任何其他变量)作为“参考”来获得一张这样的表格

mytable <- matrix (c(1, 0.5, 0.25 ,0.66, 1, 0.33, 1, 1, 1), byrow=T, ncol=3)
colnames(mytable) <- c("football","basketball","other")
rownames(mytable) <- c("football","basketball","other")

在这种情况下,

8 人中有 4 人踢足球: 踢足球的 4 人中有 4 人踢足球 (100%),4 人中有 2 人踢足球 (50%),4 人中有 1 人踢其他运动 (25%)。

8 个人中有 3 个人打篮球: 三分之二的篮球运动员也踢足球(66%),三分之三的篮球运动员打篮球(100%),三分之一的篮球运动员也参加其他运动(33%)

8 人中有 1 人从事其他运动: 1 人中的 1 人还踢足球 (100%),1 人中的 1 人打篮球 (100%),1 人中的 1 人玩其他 (100%),

另外,有没有办法像这样绘制表格(如果这个问题没有得到回答也没关系,但我们将不胜感激)

【问题讨论】:

  • 试试prop.table(tcrossprod(table(rep(names(df), each = nrow(df)), unlist(df))))
  • 感谢您的评论。但是代码没有返回我想要的输出,我不确定输出代表什么(例如,足球在所有变量中返回为 0.1,其他值在 0.1 和 0.16 之间)

标签: r


【解决方案1】:

我们可以通过一些矩阵运算来做到这一点:

m = as.matrix(df)
t(m) %*% m / colSums(m)
#             football basketball     other
# football   1.0000000        0.5 0.2500000
# basketball 0.6666667        1.0 0.3333333
# other      1.0000000        1.0 1.0000000

至于绘图,热图可能是一个不错的方法。简单地说:

gplots::heatmap.2(result, dendrogram = "none", Rowv = F, Colv = F)

为了获得更大的灵活性,我建议使用ggplot2This question should get you started.

【讨论】:

  • 感谢您的回答。这就是我要找的。而且,是的,我的问题中有错字。确实应该是 1,我已经更正了。
  • 我很好奇,Gregor,...你是怎么看到这个的?在持有“属性映射”的逻辑矩阵上使用矩阵乘法,您可能见过什么样的应用?
  • @42- 我...不能说。它让我想起了page rank algorithm,只是所有的权重都是 1,它在本科生的一个旧的线性代数课程中被覆盖。在我尝试之前我不确定它是否会起作用,但是当从一个 N x M 矩阵开始并想要一个 M x M 矩阵结果时,乘以转置似乎是一个有希望的开始。当我做t(m) %*% m 时,很明显这是并发计数,从那里开始很容易。
  • 实验编程。类比编码。我经常使用的一种方法。
猜你喜欢
  • 2020-11-25
  • 2020-03-30
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 2016-12-09
相关资源
最近更新 更多