在R中进行频数统计

8

这可能看起来像一个非常基本的R问题,但我会感激你的回答。我有一个数据框的格式如下:

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

我希望将其转化为计数,结果应该像这样。我尝试使用table ()函数,但似乎只能得到一个列的计数。
    a   b   c
g   2   1   0
h   1   1   0
i   0   1   1

我该如何在R中实现这个功能?


4
你尝试过这个吗:table(df$column1, df$column2) - Simon Müller
1
这个问题应该被暂时搁置在“不清楚你的问题”下,直到您添加了您尝试过的代码以及可能围绕您的数据结构的更多细节。 - Simon O'Hanlon
2个回答

9
我不确定你使用了什么,但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,而不是你所需要的相同格式的输出结果)。

1
或者 table(df$V1, df$V2) - csgillespie
1
@csgillespie,我喜欢直接使用table时从变量名称中获取附加标签。您可以通过指定所需的名称(例如:table(V1 = df$V1, V2 = df$V2))来实现相同的效果,但是我喜欢尽可能节省打字时间 :) - A5C1D2H2I1M1N2O1R2T1
使用 [ 可以使用存储列名的变量以编程方式选择列。 - Michele
我并不是想暗示这种方法“更好”,只是它是另一种方式。你可以想象一个未来的SO问题,其中“我有两个向量……” - csgillespie
2
@AnandaMahto 因为回答中包含table(df),得到了+7的点赞,而这个回答我只给了+1。我有时真的不明白SO的投票规则。 - Simon O'Hanlon
@AnandaMahto 现在是2 :-) 很好的答案! - Michele

4
使用@Ananda的f,您可以使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接