【问题标题】:R Generate frequency tableR 生成频率表
【发布时间】:2012-07-18 07:24:29
【问题描述】:

我有这样的样本向量:

v <- c(1, 2, 1, 3, 2, 3, 3, 4, 1, 4)

我想要的是频率表,它会告诉我数字的频率,然后是另一个数字。

输出:

  1 2 3 4
1 0 1 0 1
2 1 0 1 0
3 1 1 1 0
4 1 0 1 0

然后以百分比表示相同的值。

【问题讨论】:

  • 如果不是所有从 1 到 max(v) 的整数都在你的向量中,你想做什么?例如,假设 v 中没有“2”。您希望输出排除该行和列,还是包含零的行和列?这将影响您访问结果的方式。当然可能你的应用程序总是至少有 1 个从 1 到 max(v)...

标签: r vector frequency


【解决方案1】:

这是一种方法:

## Construct a data frame in which each row is a pair of consecutive characters.
df <- data.frame(a=head(v,-1), b=v[-1])
## tabulate frequencies of the ordered pairs
res <- xtabs(~a+b, df)
res
#    b
# a   1 2 3 4
#   1 0 1 1 1
#   2 1 0 1 0
#   3 0 1 1 1
#   4 1 0 0 0

res/sum(res)
#    b
# a           1         2         3         4
#   1 0.0000000 0.1111111 0.1111111 0.1111111
#   2 0.1111111 0.0000000 0.1111111 0.0000000
#   3 0.0000000 0.1111111 0.1111111 0.1111111
#   4 0.1111111 0.0000000 0.0000000 0.0000000

【讨论】:

  • 我喜欢构造成对连续值的简单方法。
  • 很好的解决方案,但这张表在我的示例中看起来不像。例如,3 后跟 1 一次,但您的结果在该单元格中为零。
  • 只需将公式切换到res &lt;- xtabs(~b+a, df) 即可获得您发布的结果。 (当我提出这个问题时,您的结果矩阵仍然包含 2 和 4,所以我无法确定您想要“到/从”中的行/列,而不是更常见的“从/到”排列。)
【解决方案2】:

如果我认为您的意思是正确的,请尝试:

xtabs(~v[-1]+v[1:(length(v)-1)])
     v[1:(length(v) - 1)]
v[-1] 1 2 3 4
    1 0 1 0 1
    2 1 0 1 0
    3 1 1 1 0
    4 1 0 1 0

这与您的预期输出不匹配,但我不确定您是如何得出的。

对于百分比,请使用prop.table

prop.table(xtabs(~v[-1]+v[1:(length(v)-1)]))*100
     v[1:(length(v) - 1)]
v[-1]        1        2        3        4
    1  0.00000 11.11111  0.00000 11.11111
    2 11.11111  0.00000 11.11111  0.00000
    3 11.11111 11.11111 11.11111  0.00000
    4 11.11111  0.00000 11.11111  0.00000

【讨论】:

  • v[-length(v)] 应该比 v[1:(length(v)-1)] 简单一点
  • 谢谢!我喜欢这个解决方案。但我还有一个问题。列中的百分比不应该达到 100% 吗?这是我所期望的行为。
  • 您可以使用margin 参数prop.table 指定行、列或总比例,例如对于列:margin=2
猜你喜欢
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2020-03-21
  • 2012-01-30
  • 1970-01-01
  • 2011-08-28
  • 2014-06-02
相关资源
最近更新 更多