分组和计数实例?

时间:2015-09-01 12:23:03

标签: r dplyr plyr

是否可以使用R(dplyr)对所有其他列的实例进行分组和计数?例如,以下数据框

x  a  b  c
1  0  0  0
1  1  0  1
1  2  2  1
2  1  2  1

转到此(注意:y是正在计算的值)

编辑: - 解释转换,x是我分组的,对于每个分组的数字,我想计算0和1和2被提及的次数,如在转换的数据帧的第一行中,我们计算了x = 1在其他列(y)中等于0的次数,因此0列在列一次,列b两次,列c一次

x  y  a  b  c
1  0  1  2  1
1  1  1  0  2
1  2  1  1  0
2  1  1  0  1
2  2  0  1  0

2 个答案:

答案 0 :(得分:5)

结合使用 data.table reshape2 meltdcast函数的方法:

library(data.table) # v1.9.5+
dt.new <- dcast(melt(setDT(df), id.vars="x"), x + value ~ variable)

这给出了:

dt.new
#    x value a b c
# 1: 1     0 1 2 1
# 2: 1     1 1 0 2
# 3: 1     2 1 1 0
# 4: 2     1 1 0 1
# 5: 2     2 0 1 0

dcast中,您可以指定要使用的聚合函数,但在这种情况下,这不是必需的,因为默认聚合函数是length。如果不使用聚合函数,您将收到有关该函数的警告:

  

缺少聚合函数:默认为长度

此外,如果您没有将数据框显式转换为数据表,data.table将重定向到reshape2(请参阅评论中@Arun的说明)。因此,此方法也可以与reshape2一起使用:

library(reshape2)
df.new <- dcast(melt(df, id.vars="x"), x + value ~ variable)

使用过的数据:

df <- read.table(text="x  a  b  c
1  0  0  0
1  1  0  1
1  2  2  1
2  1  2  1", header=TRUE)

答案 1 :(得分:4)

我使用了来自gather软件包的spreadtidyr以及来自count的{​​{1}}的组合:

dplyr

基本上,您首先将数据集的格式更改为:

library(dplyr)
library(tidyr)
df = data.frame(x = c(1,1,1,2), a = c(0,1,2,1), b = c(0,0,2,2), c = c(0,1,1,1))
res = df %>% 
    gather(variable, value, -x) %>% 
    count(x, variable, value) %>% 
    spread(variable, n, fill = 0)
# Source: local data frame [5 x 5]
#
#   x value a b c
# 1 1     0 1 2 1
# 2 1     1 1 0 2
# 3 1     2 1 1 0
# 4 2     1 1 0 1
# 5 2     2 0 1 0

允许您使用head(df %>% gather(variable, value, -x)) # x variable value #1 1 a 0 #2 1 a 1 #3 1 a 2 #4 2 a 1 #5 1 b 0 #6 1 b 0 获取有关某些值在counta列中出现的频率的信息。之后,使用c将数据集重新格式化为所需格式。