【问题标题】:Building a contingency table建立一个列联表
【发布时间】:2015-10-05 17:12:46
【问题描述】:

我有这样的数据:

A  B
1 10 
1 20
1 30
2 10
2 30
2 40
3 20
3 10
3 30
4 20
4 10
5 10
5 10

我想建立一个这样的列联表:

   10 20 30 40
10 1   3  2  0
20 3   0  2  0
30 2   2  0  0
40 0   0  0  0

含义:根据A列,在具体的列联表中对B列的每两个值标记+1。

你能帮我做这件事吗?

【问题讨论】:

  • 我不太明白你想要达到什么目的。当 A 有三行具有相同值时,如何定义“对于 B 列的每两个值”?你自己尝试过什么?
  • 图片中的示例:
  • 我没有看到图像。如果您指的是您提供的示例输出,那么很难推断它是如何产生的。例如,40 在 B 列中,但在列联表中没有。
  • 这里:goo.gl/P3CcpZ 非常感谢您的帮助。你可以忽略另一个例子。
  • 我还不清楚。请给出一个正确的例子和逐步解释你想要做什么。先从最简单的情况说起:A为1时的数据应该如何处理?

标签: r loops contingency


【解决方案1】:

这是一个非常丑陋的答案,使用图像中的数据,因为我已经在你的问题上花费了太多时间。一般来说,让你的结果依赖于变量的顺序是不切实际的。

A <- rep(c(1:4),c(3,2,3,3))
B <- c(10,10,30,10,20,30,20,10,10,20,30)
data <- data.frame(cbind(A,B))

#split by A
library(plyr)
data2 <- ddply(data,.(A),function(x){
  combined_pairs <- cbind(x$B[-nrow(x)],
                          x$B[-1])
  #return data where first is always lowest
  smallest <- apply(combined_pairs,MARGIN=1,
                    FUN=min)
  largest <- apply(combined_pairs,MARGIN=1,
                   FUN=max)
  return(data.frame(small=smallest,large=largest))
})


library(reshape2)

result <- dcast(small~large,data=data2, 
                fun.aggregate=length) 
> result
  small 10 20 30
1    10  1  3  1
2    20  0  0  2

如果您仍然需要它们,我认为您可以自己添加空行。

【讨论】:

    猜你喜欢
    • 2019-04-17
    • 2013-10-12
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多