中的R频率计数[重复]中的R频率计数[重复](Frequency counts in R [dupl

2019-05-08 18:54发布

这个问题已经在这里有一个答案:

  • 更快的方式从长计算频率和转换为宽 4个答案
  • 我如何获得一个列联表? 6个回答

这似乎是一个很基础研发的问题,但我会很感激的答案。 我有形式的数据帧:

col1    col2
a   g
a   h
a   g
b   i
b   g
b   h
c   i

我想将其改造成数,所以结局会是这样。 我已经使用表()函数尝试,但似乎只能够得到计数的一列。

    a   b   c
g   2   1   0
h   1   1   0
i   0   1   1

如何做到这一点在R'

Answer 1:

我真的不知道你使用的是什么,但table工作正常,我!

这里有一个最小的可重复的例子:

df <- structure(list(V1 = c("a", "a", "a", "b", "b", "b", "c"), 
                     V2 = c("g", "h", "g", "i", "g", "h", "i")), 
                .Names = c("V1", "V2"), class = "data.frame", 
                row.names = c(NA, -7L))
table(df)
#    V2
# V1  g h i
#   a 2 1 0
#   b 1 1 1
#   c 0 0 1

笔记:

  • 尝试table(df[c(2, 1)])table(df$V2, df$V1)来交换行和列。
  • 使用as.data.frame.matrix(table(df))获得data.frame作为输出。 ( as.data.frame将创建一个长data.frame ,没有一个在你的愿望相同的输出格式)。


Answer 2:

使用f从@Ananda可以使用dcast

library(reshape2)

> dcast(f, V1~V2)
Using V2 as value column: use value.var to override.
Aggregation function missing: defaulting to length
  V1  g  h  i
1 a   2  1  0
2 b   1  1  1
3 c   0  0  1

不过,我写这篇文章只是在情况下,你可能需要更多的东西不仅仅是table (对于这种情况下它是最简单的正确答案)在未来,这样的:

set.seed(1)
f$var <- rnorm(7)

> f
  V1 V2        var
1 a   g -0.6264538
2 a   h  0.1836433
3 a   g -0.8356286
4 b   i  1.5952808
5 b   g  0.3295078
6 b   h -0.8204684
7 c   i  0.4874291

> dcast(f, V1~V2, value.var="var", fun.aggregate=sum)
  V1          g          h         i
1 a  -1.4620824  0.1836433 0.0000000
2 b   0.3295078 -0.8204684 1.5952808
3 c   0.0000000  0.0000000 0.4874291


文章来源: Frequency counts in R [duplicate]