这可能看起来像一个非常基本的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中实现这个功能?
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
,而不是你所需要的相同格式的输出结果)。table(df$V1, df$V2)
- csgillespietable
时从变量名称中获取附加标签。您可以通过指定所需的名称(例如:table(V1 = df$V1, V2 = df$V2)
)来实现相同的效果,但是我喜欢尽可能节省打字时间 :) - A5C1D2H2I1M1N2O1R2T1[
可以使用存储列名的变量以编程方式选择列。 - Michelef
,您可以使用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
table(df$column1, df$column2)
。 - Simon Müller